В этом пошаговом руководстве я черпал вдохновение из замечательной книги Практическое машинное обучение с помощью 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