Untitled

 avatar
unknown
python
a year ago
6.1 kB
7
Indexable
# Import potrebnih biblioteka
import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report
import xgboost as xgb
from imblearn.over_sampling import SMOTE

# 1. korak (Učitavanje i analiza podataka)
# Učitavanje dataseta
file_path = 'kardiologija_hospitalizacija 2024-06-28.xlsx'
df = pd.read_excel(file_path)

# Pregled prvih nekoliko redova dataseta
print("\n--- Prvih nekoliko redova dataseta ---\n")
print(df.head())

# Dobijanje osnovnih informacija o datasetu (tipovi podataka, ne-null vrijednosti)
print("\n--- Osnovne informacije o datasetu ---\n")
print(df.info())

# Dobijanje osnovnih statistika o numeričkim kolonama
print("\n--- Osnovne statistike numeričkih kolona ---\n")
print(df.describe())

# Provjera broja nedostajućih vrijednosti u svakoj koloni
print("\n--- Broj nedostajućih vrijednosti po kolonama ---\n")
print(df.isnull().sum())

# 2. korak (Čišćenje podataka)
# Popunjavanje nedostajućih vrijednosti u numeričkim kolonama sa srednjim vrijednostima
numerical_cols = df.select_dtypes(include=['float64', 'int64']).columns
imputer_num = SimpleImputer(strategy='mean')
df[numerical_cols] = imputer_num.fit_transform(df[numerical_cols])

# Popunjavanje nedostajućih vrijednosti u kategorijskim kolonama sa najčešćim vrijednostima (modom)
categorical_cols = df.select_dtypes(include='object').columns
imputer_cat = SimpleImputer(strategy='most_frequent')
df[categorical_cols] = imputer_cat.fit_transform(df[categorical_cols])

# Provjera da li su sve nedostajuće vrijednosti popunjene
print("\n--- Broj nedostajućih vrijednosti nakon čišćenja ---\n")
print(df.isnull().sum())

# 3. korak (Priprema podataka za model)
# Pretvaranje svih vrijednosti u kategorijskim kolonama u stringove
df[categorical_cols] = df[categorical_cols].astype(str)

# Pretvaranje kategorijskih varijabli u numeričke
label_encoders = {}
for col in categorical_cols:
    le = LabelEncoder()
    df[col] = le.fit_transform(df[col])
    label_encoders[col] = le

#Podjela podataka na trening i test setove (80% trening, 20% test)
X = df.drop('dcNyha', axis=1)  # X sadrži sve kolone osim ciljne promenljive 'dcNyha'
y = df['dcNyha']  # Ciljna promenljiva 'dcNyha'

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

#Provjera dimenzija trening i test setova
print("\n--- Dimenzije trening i test setova ---\n")
print(f"Dimenzije trening seta x: {X_train.shape}, y: {y_train.shape}")
print(f"Dimenzije test seta x: {X_test.shape}, y: {y_test.shape}")

# 4. korak (Treniranje modela)
# Treniranje RandomForestClassifier na trening setu
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

# Predikcija na test setu
y_pred = model.predict(X_test)

# 5. korak (Evaluacija modela)
# Evaluacija modela
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted', zero_division=0)
recall = recall_score(y_test, y_pred, average='weighted', zero_division=0)
f1 = f1_score(y_test, y_pred, average='weighted', zero_division=0)

print("\n--- Evaluacija modela ---\n")
print(f"Tačnost: {accuracy}")
print(f"Preciznost: {precision}")
print(f"Odziv: {recall}")
print(f"F1 score: {f1}")

# Detaljan izvještaj o klasifikaciji
print("\n--- Izvještaj o klasifikaciji ---\n")
print(classification_report(y_test, y_pred, zero_division=0))

# Razmatranje problema sa modelom
# Na primjer, loša klasifikacija NYHA II klase
class_report = classification_report(y_test, y_pred, output_dict=True, zero_division=0)
print("\n--- Detalji za NYHA II klasu ---\n")
print(f"Preciznost: {class_report['1']['precision']}")
print(f"Odziv: {class_report['1']['recall']}")
print(f"F1 score: {class_report['1']['f1-score']}")

# 6. korak (Poboljšanje modela)
# Korištenje drugih algoritama
# Treniranje XGBoost modela
xgb_model = xgb.XGBClassifier(random_state=42)
xgb_model.fit(X_train, y_train)

# Predikcija na test setu
y_pred_xgb = xgb_model.predict(X_test)

# Evaluacija modela
accuracy_xgb = accuracy_score(y_test, y_pred_xgb)
precision_xgb = precision_score(y_test, y_pred_xgb, average='weighted', zero_division=0)
recall_xgb = recall_score(y_test, y_pred_xgb, average='weighted', zero_division=0)
f1_xgb = f1_score(y_test, y_pred_xgb, average='weighted', zero_division=0)

print("\n--- Evaluacija XGB modela ---\n")
print(f"Tačnost: {accuracy_xgb}")
print(f"Preciznost: {precision_xgb}")
print(f"Odziv: {recall_xgb}")
print(f"F1 score: {f1_xgb}")

# Detaljan izvještaj o klasifikaciji
print("\n--- Izvještaj o klasifikaciji (XGBoost) ---\n")
print(classification_report(y_test, y_pred_xgb, zero_division=0))

#Balansiranje klasa
# Primjena SMOTE sa smanjenim brojem susjeda
smote = SMOTE(random_state=42, k_neighbors=1)
X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)

# Treniranje RandomForestClassifier na balansiranom setu
model_smote = RandomForestClassifier(random_state=42)
model_smote.fit(X_train_smote, y_train_smote)

# Predikcija na test setu
y_pred_smote = model_smote.predict(X_test)

# Evaluacija modela
accuracy_smote = accuracy_score(y_test, y_pred_smote)
precision_smote = precision_score(y_test, y_pred_smote, average='weighted', zero_division=0)
recall_smote = recall_score(y_test, y_pred_smote, average='weighted', zero_division=0)
f1_smote = f1_score(y_test, y_pred_smote, average='weighted', zero_division=0)

print("\n--- Evaluacija modela sa SMOTE ---\n")
print(f"Tačnost: {accuracy_smote}")
print(f"Preciznost: {precision_smote}")
print(f"Odziv: {recall_smote}")
print(f"F1 score: {f1_smote}")

# Detaljan izvještaj o klasifikaciji
print("\n--- Izvještaj o klasifikaciji (SMOTE) ---\n")
print(classification_report(y_test, y_pred_smote, zero_division=0))
Editor is loading...
Leave a Comment