В этом пошаговом руководстве я черпал вдохновение из замечательной книги Практическое машинное обучение с помощью Scikit-Learn, Keras & TensorFlow для предоставления исчерпывающего объяснения.
Если вы заинтересованы в регрессии, обратитесь к моему предыдущему сообщению в блоге Пошаговое руководство по регрессии кода, в котором я представил комплексную реализацию кода для задачи регрессии. Код охватывал основные шаги, связанные с выполнением регрессионного анализа, включая предварительную обработку данных, проектирование признаков, выбор модели и оценку.
Давайте углубимся в код
ИМПОРТ ДАННЫХ
Импорт данных из Git Hub идеален, когда несколько разработчиков работают над одними и теми же данными. (динамический способ)
import os import tarfile import urllib DOWNLOAD_ROOT = "https://raw.githubusercontent.com/NithishaRaghavaraju/ML/main/" PATH = os.path.join("Cancer") URL = DOWNLOAD_ROOT + "Classification/data.csv" CancerData_url=URL CancerData_path=PATH os.makedirs(CancerData_path, exist_ok=True) path = os.path.join(CancerData_path, "CancerData.csv") urllib.request.urlretrieve(CancerData_url, path) #Loading the data set import pandas as pd def load_dataset(path=CancerData_path): path = os.path.join(path,"CancerData.csv") return pd.read_csv(path) dataset = load_dataset() dataset.head()
ПРИМЕЧАНИЕ. Файл data.csv состоит из «диагностики», «среднего_радиуса», «среднего_текстуры», «среднего_периметра», «среднего_площади», «среднего_гладкости», ……. , диагноз представляет собой параметр метки, который содержит категориальные значения M и B, где M обозначает злокачественное заболевание, а B обозначает доброкачественное заболевание.
АНАЛИЗ ДАННЫХ
Перед выбором модели рекомендуется убедиться, что метки классификации имеют сбалансированное количество меток. Во избежание неверных прогнозов.
dataset["diagnosis"].value_counts() #Output #B 357 #M 212 benign_count = (dataset["diagnosis"] == 'B').sum() malignant_count = (dataset["diagnosis"] == 'M').sum() # Determine the minimum count between the two classes min_count = min(benign_count, malignant_count) # Sample an equal number of samples from each class benign_samples = dataset[dataset["diagnosis"] == 'B'].sample(n=min_count, random_state=42) malignant_samples = dataset[dataset["diagnosis"] == 'M'].sample(n=min_count, random_state=42) # Combine the sampled data from both classes balanced_df = pd.concat([benign_samples, malignant_samples]) balanced_df["diagnosis"].value_counts() #Output #B 212 #M 212
Удаление ненужных столбцов
X = balanced_df.drop(["diagnosis","id"],axis=1) X = X.iloc[:,:-1] Y = balanced_df["diagnosis"]
РАЗДЕЛЕНИЕ ДАННЫХ
Разделив данные, мы можем позже проверить, насколько хорошо наша модель работает с новыми данными.
from sklearn.model_selection import train_test_split X_train,X_test, Y_train,Y_test = train_test_split(X,Y, test_size=0.2, random_state=42)
МАСШТАБИРОВАНИЕ ФУНКЦИЙ
Примените масштабирование признаков к числовым данным, чтобы обеспечить распределение значений в форме колокола, избегая при этом тяжелого хвостового распределения.
from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.impute import SimpleImputer num_pipeline = Pipeline([ ('imputer', SimpleImputer(strategy="median")), ('std_scaler', StandardScaler()), ]) attribs = list(X_train) cat_attribs = ["ocean_proximity"] full_pipeline = ColumnTransformer([ ("num", num_pipeline, attribs), ]) X_train = full_pipeline.fit_transform(X_train)
Преобразование меток диагноза в True и False, где True означает «M», а False означает «B».
Y_train = (Y_train=="M") Y_test = (Y_test=="B")
ОБУЧЕНИЕ И ОЦЕНКА ПО МОДЕЛИ МО
ЛОГИСТИЧЕСКАЯ РЕГРЕССИЯ
Обучение модели с помощью логистической регрессии.
from sklearn.linear_model import LogisticRegression LR_clf = LogisticRegression() LR_clf.fit(X_train,Y_train)
Давайте предскажем значения на проверочном наборе
from sklearn.model_selection import cross_val_predict y_train_pred = cross_val_predict(LR_clf, X_train, Y_train, cv=3)
Cross_val_predict() выполняет перекрестную проверку K-кратности, но вместо того, чтобы возвращать оценочные баллы, она возвращает прогнозы, сделанные для каждой свертки теста. Это означает, что вы получаете чистый прогноз для каждого экземпляра в обучающем наборе («чистый» означает, что прогноз сделан моделью, которая никогда не видела данные во время обучения).
Лучшей метрикой для использования в классификации является «МАТРИЦА НЕИСПРАВНОСТИ».
from sklearn.metrics import confusion_matrix confusion_matrix(Y_train, y_train_pred) #output #array([[163, 3], # [ 8, 165]])
163 указывают на истинные положительные значения (TP), 163 функции были истинными метками в фактических данных, которые были правильно предсказаны как истинные. Точно так же 165 указывает на True Negatives (TN), 165 функций были ложными метками в фактических данных, которые были правильно предсказаны как ложные.
В то время как 3 указывает на ложные срабатывания (FP), 3 функции были ложными метками в фактических данных, которые были ошибочно предсказаны как истинные. Точно так же 8 указывает на ложные отрицательные значения (FN), 8 признаков были истинными, метки в фактических данных были ошибочно предсказаны как ложные.
Чтобы быть более кратким, давайте предскажем показатель точности и показатель отзыва.
from sklearn.metrics import precision_score, recall_score precision_score(Y_train, y_train_pred) #o/p : 0.9821428571428571 recall_score(Y_train, y_train_pred) #o/p : 0.953757225433526
(Обратитесь к этому видео на YouTube https://youtu.be/9yl6-HEY7_s, чтобы узнать больше о компромиссе точности припоминания.)
y_scores = cross_val_predict(LR_clf, X_train, Y_train, cv=3,method="decision_function") from sklearn.metrics import precision_recall_curve precisions, recalls, thresholds = precision_recall_curve(Y_train, y_scores_dec) plt.plot(recalls,precisions) plt.ylabel("Precision", fontsize=16) plt.xlabel("Recall", fontsize=16) plt.grid(True) plt.show()
Порог легко настроить на основе требуемого значения точности. Предположим, нам нужна 80-процентная точность.
threshold_80_precision = thresholds[np.argmax(precisions >= 0.80)] y_train_pred_80 = (y_scores >= threshold_80_precision) precision_score(Y_train, y_train_pred_80) #o/p 0.8037383177570093 recall_score(Y_train, y_train_pred_80) #o/p 0.9942196531791907
Мы также рассмотрим кривую FPR и TPR.
from sklearn.metrics import roc_curve fpr, tpr, thresholds = roc_curve(Y_train, y_scores) def plot_roc_curve(fpr, tpr, label=None): plt.grid(True) plt.plot(fpr, tpr, linewidth=2, label=label) plt.plot([0, 1], [0, 1], 'k--') # Dashed diagonal plot_roc_curve(fpr, tpr) plt.show()
roc_auc_score указывает площадь под кривой на приведенном выше графике.
from sklearn.metrics import roc_auc_score roc_auc_score(Y_train, y_scores) #o/p 0.9927919771571836
ТЕСТИРОВАНИЕ МОДЕЛИ
X_test= full_pipeline.transform(X_test) Y_test = np.array(Y_test) LR_predictions = LR_clf.predict(X_test) from sklearn.metrics import confusion_matrix confusion_matrix(Y_test, LR_predictions) #o/p #array([[44, 2], # [ 2, 37]])
Хотя мы получили ту же точность и полноту с этой моделью, вы можете изменить порог, как показано в приведенном выше коде, чтобы получить необходимую точность.
Обратитесь к приведенной ниже ссылке GitHub, чтобы получить полный код. Я также включил в код модель SVM (машина опорных векторов).
ССЫЛКА НА GITHUB: https://github.com/NithishaRaghavaraju/ML