В мире машинного обучения так много функциональных алгоритмов, алгоритмов регрессии, алгоритмов классификации. В этом посте я попытаюсь простым способом сравнить некоторые алгоритмы классификации, используя набор данных о диабете, чтобы делать прогнозы.
Сначала импортируйте библиотеки и набор данных:
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline url = "https://raw.githubusercontent.com/MateLabs/Public-Datasets/master/Datasets/diabetes.csv" diabetes_df = pd.read_csv(url) names = ["times_pregnant", "glucose_concentration", "blood_pressure", "skin_fold", "serum_insulin", "body_mass", "diabetes_pedigree", "age", "class"] diabetes_df.columns = names diabetes_df.head()
Первые строки набора данных:
Наш последний столбец «класс» будет вектором «y», мы обрабатываем этот столбец, преобразовывая «положительное» значение в 1 и «отрицательное» значение в 0.
diabetes_df['class'][diabetes_df['class'] == 'positive'] = 1 diabetes_df['class'][diabetes_df['class'] == 'negative'] = 0 diabetes_df.head()
Выглядит так:
Давайте посмотрим на описательную статистику:
print("Size: {}".format(diabetes_df.shape)) print(diabetes_df.describe()) diabetes_df.hist() plt.show()
сравнение машинного обучения
Теперь, когда мы посмотрели наш набор данных, пришло время оценить алгоритмы ML.
Сначала мы делим наш набор данных на «X» и «y», разделяем на обучающий и тестовый наборы, а затем стандартизируем характеристики X, удаляя среднее и масштабируя до единичной дисперсии.
X = diabetes_df.iloc[:,0:8] y = diabetes_df.iloc[:,8] y = y.astype('int') #Split into train and test set using sklearn model_selection from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=7) # Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
Следующим шагом будет импорт библиотек и создание списка с нашими моделями.
from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold models = [] models.append(('LR', LogisticRegression())) models.append(('LDA', LinearDiscriminantAnalysis())) models.append(('KNN', KNeighborsClassifier())) models.append(('CART', DecisionTreeClassifier())) models.append(('NB', GaussianNB())) models.append(('SVM', SVC()))
Оценим работу оценщиков
results = [] names = [] for name, model in models: kfold = KFold(n_splits=10, random_state=seed) cv_results = cross_val_score(model, X_train, y_train, cv=kfold, scoring=scoring) results.append(cv_results) names.append(name) print("{} {}({})"(name, cv_results.mean(), cv_results.std()))
Как мы видим, логистическая регрессия имеет наилучшую производительность, поэтому наш выбор заключается в том, чтобы соответствовать обучающему и тестовому набору и начать делать прогнозы.
cls = LogisticRegression(random_state=7) cls.fit(X_train,y_train) y_pred = cls.predict(X_test)
И на последнем этапе мы сравниваем наши прогнозы с правдой.
print(accuracy_score(y_test,y_pred)) print(confusion_matrix(y_test,y_pred)) print(classification_report(y_test,y_pred))
Мы получаем точность алгоритма логистической регрессии по нашим значениям. Соответствующие элементы или истинно положительные и ложноотрицательные являются правильнымипрогнозами.
Последние мысли
Мы знаем, что в большинстве случаев производительность алгоритма машинного обучения зависит от нашей способности исследовать, интерпретировать и управлять данными. Но возможность сравнить их производительность дает нам представление о том, какой алгоритм лучше всего использовать.
Этот пример был загружен на Github в блокноте Jupyter: