В этой статье я покажу вам, как создать свою собственную программу машинного обучения на Python для обнаружения рака груди по данным. Рак молочной железы (РМЖ) - это распространенный вид рака у женщин во всем мире, и раннее обнаружение РМЖ может значительно улучшить прогноз и шансы на выживание за счет раннего продвижения клинического лечения пациентов. Так что здорово иметь возможность спасать жизни, просто используя данные, Python и машинное обучение!

Если вы предпочитаете не читать эту статью и хотите ее видеопрезентацию, вы можете проверить Видео YouTube ниже. В нем подробно рассматривается все, что описано в этой статье, и он поможет вам легко начать программировать собственную модель машинного обучения, даже если на вашем компьютере не установлен язык программирования Python. Или вы можете использовать оба в качестве дополнительных материалов для изучения машинного обучения!

Начать программирование:

Первое, что я люблю делать перед написанием единственной строчки кода, - это вставлять описание в комментарии того, что делает код. Таким образом, я могу оглянуться на свой код и точно знать, что он делает.

#Description: This program detects breast cancer, based off of data. 

Теперь импортируйте пакеты / библиотеки, чтобы упростить написание программы.

#import libraries 
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns

Затем я загружу данные и распечатаю первые 7 строк данных.

ПРИМЕЧАНИЕ. Каждая строка данных представляет пациента, который может иметь или не болеть раком.

#Load the data 
#from google.colab import files # Use to load data on Google Colab #uploaded = files.upload() # Use to load data on Google Colab df = pd.read_csv('data.csv') 
df.head(7)

Изучите данные и подсчитайте количество строк и столбцов в наборе данных. Это 569 строк данных, что означает, что в этом наборе данных 569 пациентов, и 33 столбца, которые означают, что это 33 функции или точки данных для каждого пациента.

#Count the number of rows and columns in the data set
df.shape

Продолжайте изучать данные и подсчитайте количество всех столбцов, содержащих пустые значения (NaN, NAN, na). Обратите внимание, что ни один из столбцов не содержит пустых значений, кроме столбца с именем «Безымянный: 32», который содержит 569 пустых значений (такое же количество строк в наборе данных, это говорит мне, что этот столбец совершенно бесполезен. )

#Count the empty (NaN, NAN, na) values in each column
df.isna().sum()

Удалите столбец «Безымянный: 32» из исходного набора данных, поскольку он не добавляет значения.

#Drop the column with all missing values (na, NAN, NaN)
#NOTE: This drops the column Unnamed
df = df.dropna(axis=1)

Получите новый счет количества строк и столбцов.

#Get the new count of the number of rows and cols
df.shape

Подсчитайте количество пациентов со злокачественными (M) раковыми и доброкачественными (B) доброкачественными клетками.

#Get a count of the number of 'M' & 'B' cells
df['diagnosis'].value_counts()

Визуализируйте подсчеты, создав график подсчета.

#Visualize this count 
sns.countplot(df['diagnosis'],label="Count")

Посмотрите на типы данных, чтобы узнать, какие столбцы необходимо преобразовать / закодировать. По типам данных я вижу, что все столбцы / функции являются числами, за исключением столбца «диагностика», который представляет собой категориальные данные, представленные в виде объекта в Python .

#Look at the data types 
df.dtypes

Кодируйте категориальные данные. Измените значения в столбце «диагностика» с M и B на 1 и 0 соответственно, затем распечатайте результаты.

#Encoding categorical data values (
from sklearn.preprocessing import LabelEncoder
labelencoder_Y = LabelEncoder()
df.iloc[:,1]= labelencoder_Y.fit_transform(df.iloc[:,1].values)
print(labelencoder_Y.fit_transform(df.iloc[:,1].values))

Создайте парный сюжет. «Парный график» также известен как диаграмма рассеяния, на которой одна переменная в той же строке данных сопоставляется со значением другой переменной.

sns.pairplot(df, hue="diagnosis")

Распечатайте новый набор данных, в котором теперь всего 32 столбца. Выведите только первые 5 строк.

df.head(5)

Получите корреляцию столбцов.

#Get the correlation of the columns
df.corr()

Визуализируйте корреляцию, создав тепловую карту.

plt.figure(figsize=(20,20))  
sns.heatmap(df.corr(), annot=True, fmt='.0%')

Теперь я закончил изучение и очистку данных. Я настрою свои данные для модели, сначала разделив набор данных на набор данных функции, также известный как независимый набор данных (X), и целевой набор данных, также известный как набор зависимых данных. (Y).

X = df.iloc[:, 2:31].values 
Y = df.iloc[:, 1].values 

Разделите данные еще раз, но на этот раз на 75% наборов данных для обучения и 25% для тестирования.

from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0)

Масштабируйте данные, чтобы привести все функции к одному и тому же уровню величины, что означает, что функция / независимые данные будут находиться в определенном диапазоне, например 0–100 или 0–1.

#Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Создайте функцию для хранения множества различных моделей (например, логистической регрессии, классификатора дерева решений, классификатора случайного леса) для сделать классификацию. Это модели, которые определят, есть у пациента рак или нет. В этой функции я также напечатаю точность каждой модели на обучающих данных.

def models(X_train,Y_train):
  
  #Using Logistic Regression 
  from sklearn.linear_model import LogisticRegression
  log = LogisticRegression(random_state = 0)
  log.fit(X_train, Y_train)
  
  #Using KNeighborsClassifier 
  from sklearn.neighbors import KNeighborsClassifier
  knn = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
  knn.fit(X_train, Y_train)

  #Using SVC linear
  from sklearn.svm import SVC
  svc_lin = SVC(kernel = 'linear', random_state = 0)
  svc_lin.fit(X_train, Y_train)

  #Using SVC rbf
  from sklearn.svm import SVC
  svc_rbf = SVC(kernel = 'rbf', random_state = 0)
  svc_rbf.fit(X_train, Y_train)

  #Using GaussianNB 
  from sklearn.naive_bayes import GaussianNB
  gauss = GaussianNB()
  gauss.fit(X_train, Y_train)

  #Using DecisionTreeClassifier 
  from sklearn.tree import DecisionTreeClassifier
  tree = DecisionTreeClassifier(criterion = 'entropy', random_state = 0)
  tree.fit(X_train, Y_train)

  #Using RandomForestClassifier method of ensemble class to use Random Forest Classification algorithm
  from sklearn.ensemble import RandomForestClassifier
  forest = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0)
  forest.fit(X_train, Y_train)
  
  #print model accuracy on the training data.
  print('[0]Logistic Regression Training Accuracy:', log.score(X_train, Y_train))
  print('[1]K Nearest Neighbor Training Accuracy:', knn.score(X_train, Y_train))
  print('[2]Support Vector Machine (Linear Classifier) Training Accuracy:', svc_lin.score(X_train, Y_train))
  print('[3]Support Vector Machine (RBF Classifier) Training Accuracy:', svc_rbf.score(X_train, Y_train))
  print('[4]Gaussian Naive Bayes Training Accuracy:', gauss.score(X_train, Y_train))
  print('[5]Decision Tree Classifier Training Accuracy:', tree.score(X_train, Y_train))
  print('[6]Random Forest Classifier Training Accuracy:', forest.score(X_train, Y_train))
  
  return log, knn, svc_lin, svc_rbf, gauss, tree, forest

Создайте модель, содержащую все модели, и посмотрите на оценку точности обучающих данных для каждой модели, чтобы определить, есть ли у пациента рак или нет.

model = models(X_train,Y_train)

Покажите матрицу неточностей и точность моделей на тестовых данных. Матрица путаницы сообщает нам, скольким пациентам каждая модель поставила неверный диагноз (количество пациентов с раком, которым был ошибочно поставлен диагноз рака, то есть ложноотрицательный, и количество пациентов, у которых не было рака, которым был поставлен неверный диагноз. с раком, также называемым ложноположительным), и количеством правильных диагнозов, истинно положительных и истинно отрицательных.

Ложно-положительный результат (FP) = результат теста, который неверно указывает на наличие определенного условия или атрибута.

Истинно положительный результат (TP) = Чувствительность (также называемая показателем истинного положительного результата или вероятностью обнаружения в некоторых полях) измеряет долю фактических положительных результатов, которые правильно определены как таковые.

Истинно отрицательный (TN) = Специфичность (также называемый истинно отрицательным показателем) измеряет долю фактических отрицательных, которые правильно идентифицированы как таковые.

Ложноотрицательный (FN) = результат теста, который указывает на то, что условие не выполняется, хотя на самом деле оно выполняется. Например, результат теста, который указывает на то, что у человека нет рака, хотя он действительно есть.

from sklearn.metrics import confusion_matrix
for i in range(len(model)):
  cm = confusion_matrix(Y_test, model[i].predict(X_test))
  
  TN = cm[0][0]
  TP = cm[1][1]
  FN = cm[1][0]
  FP = cm[0][1]
  
  print(cm)
  print('Model[{}] Testing Accuracy = "{}!"'.format(i,  (TP + TN) / (TP + TN + FN + FP)))
  print()# Print a new line

Другие способы получить метрики модели, чтобы увидеть, насколько хорошо каждая из них работает.

#Show other ways to get the classification accuracy & other metrics 

from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score

for i in range(len(model)):
  print('Model ',i)
  #Check precision, recall, f1-score
  print( classification_report(Y_test, model[i].predict(X_test)) )
  #Another way to get the models accuracy on the test data
  print( accuracy_score(Y_test, model[i].predict(X_test)))
  print()#Print a new line

Судя по точности и метрикам, приведенным выше, модель, которая показала наилучшие результаты на тестовых данных, - это классификатор случайного леса с показателем точности около 96,5%. Итак, я выберу эту модель для обнаружения раковых клеток у пациентов. Сделайте прогноз / классификацию на основе тестовых данных и покажите как классификацию / прогноз модели случайного лесного классификатора, так и фактические значения пациента, которые показывают, есть ли у него рак.

Я заметил, что модель ошибочно диагностировала у нескольких пациентов рак, хотя они этого не сделали, и неверно диагностировала пациентов, у которых действительно был рак, как не больных раком. Хотя эта модель хороша, когда я имею дело с жизнями других людей, я хочу, чтобы эта модель была лучше и чтобы ее точность была как можно ближе к 100% или, по крайней мере, так хорошо, как если бы не лучше, чем у врачей. Так что необходима дополнительная настройка каждой из моделей.

#Print Prediction of Random Forest Classifier model
pred = model[6].predict(X_test)
print(pred)

#Print a space
print()

#Print the actual values
print(Y_test)

Вот и все, вы создали свою программу обнаружения груди, чтобы предсказать, есть у пациента рак или нет! Опять же, если хотите, можете посмотреть и послушать, как я объясняю весь код на моем видео на YouTube.

Если вам интересно узнать больше о машинном обучении, чтобы сразу приступить к работе с проблемами и примерами, я настоятельно рекомендую вам ознакомиться с Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем. Системы ». Это отличная книга, которая поможет новичкам научиться писать программы машинного обучения и понять концепции машинного обучения.

Спасибо за прочтение этой статьи, надеюсь, она будет вам полезна! Если вам понравилась эта статья и вы нашли ее полезной, пожалуйста, оставьте несколько аплодисментов, чтобы выразить свою признательность. Продолжайте обучение, и если вам нравится машинное обучение, математика, информатика, программирование или анализ алгоритмов, посетите и подпишитесь на мои каналы YouTube (randerson112358 и compsci112358).

Ресурсы:

[1] https://en.wikipedia.org/wiki/Confusion_matrix
[2] https://towardsdatascience.com/building-a-simple-machine-learning-model-on-breast- рак-данные-eca4b3b99fa3