Этот проект машинного обучения предназначен для предсказания типа опухоли - злокачественной или доброкачественной. Набор данных - это база данных машинного обучения UIC. Его можно скачать здесь. Загруженный набор данных представляет собой файл .data. Расширение файла можно изменить на файл .csv. Столбцы обозначаются как id, толщина сгустка, однородность размера клеток, однородность формы клеток, маргинальная адгезия, размер единичных эпителиальных клеток, голые ядра, мягкий хроматин, "нормальные ядрышки", "митоз" и "класс"

Необходимые пакеты импортированы.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
from sklearn import preprocessing
from sklearn.svm import SVC
from sklearn import model_selection
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report,accuracy_score
from pandas.plotting import scatter_matrix
import seaborn as sns

ЗАГРУЗКА ДАННЫХ

Набор данных загружается в фрейм данных «df».

df = pd.read_csv(‘Breast cancer.csv’) # The data set ‘Breast cancer.csv’ is loaded into ‘df’ dataframe.
df.head() # Displays the first five rows of ‘df’.

id, толщина сгустка, однородность размера клеток, однородность формы клеток, маргинальная адгезия, размер единичных эпителиальных клеток, голые ядра, мягкий хроматин, нормальные ядрышки, «митоз» - это переменные, используемые для прогнозирования выходного «класса».

df.shape

Фрейм данных имеет форму (699,11), что предполагает наличие 699 обучающих примеров.

ПОДГОТОВКА ДАННЫХ

df.drop(‘id’,axis = 1,inplace = True) # 'axis = 1' denotes column and 'inplace = True' denotes changes are saved in 'df'.

Столбец «id» опускается, потому что он не влияет на выходной «class».

df.shape

Теперь фрейм данных имеет форму (699,10)

Проверка отсутствующих значений

col_names = ['clump thickness’,’uniformity of cell size’,’uniformity of cell shape’,’marginal adhesion’,’single epithelial cell size’,’bare nuclei’,’bland chromatin’,’normal nucleoli’,’mitosis’,’class’] # ‘col_names’ is a list of column names in‘Breast cancer.csv’
# Prints count of each column
for x in col_names: 
 print(df[x].count())

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

Для двойной проверки мы строим тепловую карту.

sns.heatmap(df.isnull())
# df.isnull() is True (value =1)if null value and False (value = 0) otherwise.

Значение 0 повсюду. Тепловая карта также предполагает, что отсутствуют пропущенные значения.

Проверка категориальных переменных

# Prints total number of unique elements in each column
for x in col_names: 
 print(df[x].nunique())

Все переменные являются категориальными переменными.

df.drop(‘bare nuclei’,axis = 1,inplace = True)

Столбец «Голые ядра» опущен из-за проблем с форматированием.

Анализ данных

df.describe()

Выходная переменная «класс» дискретна и принимает два значения: - 2 (доброкачественное) и 4 (злокачественное). Среднее значение «класса» ближе к 2, что указывает на более доброкачественные случаи. Минимальное и максимальное значение всех входных переменных - 1 и 10 соответственно.

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

ВИЗУАЛИЗАЦИЯ ДАННЫХ

df.hist(figsize = (10,8))
plt.show()

«Толщина комка» до некоторой степени распределена равномерно. Все остальные переменные смещены вправо.

plt.figure(figsize = (10,10))
sns.pairplot(df)

«Однородность размера клеток», по-видимому, имеет сильную линейную связь с «однородностью формы клеток». Последняя строка, где «класс» нанесена на график для каждой из входных переменных, предполагает, что построение границы принятия решения будет сложной задачей. (Граница решения - это гиперповерхность, которая разделяет базовое векторное пространство на два набора, по одному для каждого класса).

МОДЕЛЬНОЕ ОБУЧЕНИЕ

Набор данных предварительно обработан и готов к обучению. Сравнение проводится между двумя моделями: - SVC (классификатор опорных векторов) и KNN (K-ближайшие соседи).

Сравнение SVC и KNN

Сравнение проводится на основе оценки перекрестной проверки. Данный обучающий набор разделен на 2 набора: «Train_set» и «Test_set». Модель обучается с использованием части Train_set. Оценка перекрестной проверки рассчитывается на основе производительности обученной модели в другой части «Train_set».

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

Обучающий набор разделен на «Train_set» и «Test_set».

X = df.drop(‘class’,1) # X is input
y = df[‘class’] # y is output
X_train,X_test,y_train,y_test = model_selection.train_test_split(X,y,test_size=0.2) # Spitting into 'Train_set' and 'Test_set'.

Баллы перекрестной проверки рассчитываются для обеих моделей.

validation_type = model_selection.KFold(n_splits = 10) # K-Fold cross validation technique is used.
cross_validation_result1 = model_selection.cross_val_score(SVC(),X_train,y_train,cv = validation_type,scoring = ‘accuracy’) # Cross validation score of SVC model.
cross_validation_result2 = model_selection.cross_val_score(KNeighborsClassifier(n_neighbors = 5),X_train,y_train,cv = validation_type,scoring = ‘accuracy’) # Cross validation score of KNN model.
print(cross_validation_result1.mean(),cross_validation_result2.mean())

Оценка перекрестной проверки модели SVC = 0,9605

Оценка перекрестной проверки модели KNN = 0,9534

Ожидается, что производительность модели SVC на данном наборе данных будет лучше, чем у модели KNN. Давайте проверим это, обучив модель с помощью «Train_set» и вычислив «показатель точности» и «отчет о классификации» с помощью «Test_set».

Производительность модели SVC

a = SVC().fit(X_train,y_train) # Fitting the model.
predictions = a.predict(X_test) # Test set is predicted.
print(accuracy_score(y_test,predictions)) # Accuracy score is calculated.
print(classification_report(y_test,predictions)) # Classification report is generated.

Производительность модели KNN

b = KNeighborsClassifier(n_neighbors = 5).fit(X_train,y_train) # Fitting the model.
predictions = b.predict(X_test) # Test set is predicted.
print(accuracy_score(y_test,predictions)) # Accuracy score is calculated.
print(classification_report(y_test,predictions)) # Classification report is generated.

Оценка точности модели SVC = 0,964

Оценка точности модели KNN = 0,957.

Как и ожидалось, точность и оценка F1 модели SVC лучше, чем модель KNN для данного набора данных.

Прогнозирование с использованием обученной модели

Обученная модель SVC используется для прогнозирования конкретного случая: - «толщина сгустка» = 1, «однородность размера клеток» = 2, «однородность формы клеток» = 2, «маргинальная адгезия» = 5, «размер единичных эпителиальных клеток». '= 3,' мягкий хроматин '= 6,' нормальные ядрышки '= 4,' митоз '= 8.

prediction = a.predict(np.array([[1,2,2,5,3,6,4,8]]))
print(prediction)

Прогнозируемое значение «класса» равно 4, что предполагает злокачественную опухоль.

Приятного чтения!