В этом посте я пытаюсь сравнить производительность различных классификаторов машинного обучения, предоставляемых библиотекой Scikit Learn. Я пытаюсь сравнить производительность K-ближайших соседей, многослойного персептрона, дерева решений и машин опорных векторов при классификации набора данных о диабете, который я скачал с Kaggle.

Данные

Набор данных, который я использую здесь, — это набор данных о диабете индейцев пима от Kaggle. Давайте сначала посмотрим на набор данных.

  1. Форма данных
    Данные состоят из 2000 строк и 9 столбцов. Последний столбец («Результат») — это категория, содержащая только 2 класса: 0 и 1.
  2. Распределение классов
    Классы 0 и 1 распределены неравномерно. Класс 0 состоит из 1306 экземпляров, а класс 1 состоит только из 684 экземпляров.
  3. Корреляция классов
    Используя функцию corr(), мы видим, что функции не сильно коррелируют с классом «Результат». Признак «Глюкоза» имеет самую высокую корреляцию с классом с 0,45.
  4. NaN
    В наборе данных нет значения NaN.

Предварительная обработка

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

#Splitting Features and Class
X = df.drop(columns=['Outcome']) #<<Training Data
y = df['Outcome'].values #<<Kelas
#Split into Train and Test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=i)

Избыточная выборка
Поскольку данные несбалансированы, я использую технику избыточной выборки (SMOTE), чтобы сбалансировать их.

X_train, y_train = SMOTE().fit_resample(X_train, y_train)

Стандартный масштабатор
Я использую стандартный масштабатор для нормализации данных. Это улучшит производительность классификатора MLP. Преобразуйте как поезд, так и тестовые данные.

scaler = StandardScaler()  
scaler.fit(X_train)  
X_train = scaler.transform(X_train)  
X_test = scaler.transform(X_test)

Модели машинного обучения

Как я упоминал ранее, я использую здесь модели KNN, MLP, Decision Tree и SVM.

K-ближайших соседей
При использовании k=3 точность, полученная KNN, составляет 0,91.

model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)
target_pred = model.predict(X_test)
acc=accuracy_score(y_test,target_pred)
print('Accuracy : ',acc)
Out
Accuracy :  0.91

Я попробовал алгоритм KNN на ненормализованных данных (данные без нормализации Standard Scaler), и, похоже, это не повлияло.

model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)
target_pred = model.predict(X_test)
acc=accuracy_score(y_test,target_pred)
print(‘Accuracy : ‘,acc)
Out
Accuracy : 0.9075

ANN — многослойный персептрон
Используя функцию по умолчанию, этот алгоритм получил точность 0,94.

model = MLPClassifier(max_iter = 1000)
model.fit(X_train, y_train)
target_pred = model.predict(X_test)
acc=(accuracy_score(y_test,target_pred))
print('Accuracy : ',acc)
Out
Accuracy : 0.94

Без стандартного скалера MLP получил более низкую точность, которая составляет всего 0,71 (самая низкая из всех).

model = MLPClassifier(max_iter = 1000)
model.fit(X_t, y_t)
target_pred = model.predict(X_t2)
acc=(accuracy_score(y_t2,target_pred))
print('Accuracy : ',acc)
Out
Accuracy :  0.71

Классификатор дерева решений
Классификатор дерева решений показал самую высокую точность на данный момент — 0,97. В своем предыдущем посте я писал о том, что на Дерево решений не влияют несбалансированные данные.

model = DecisionTreeClassifier()
model.fit(X_train, y_train)
target_pred = model.predict(X_test)
acc=accuracy_score(y_test,target_pred)
print(‘Accuracy : ‘,acc)
Out
Accuracy : 0.97

Не только из-за несбалансированных данных, дерево решений, похоже, не беспокоит стандартный масштабатор, оно получило точность 0,98 без нормализации данных.

model = DecisionTreeClassifier()
model.fit(X_t, y_t)
target_pred = model.predict(X_t2)
acc=(accuracy_score(y_t2,target_pred))
print('Accuracy : ',acc)
Out
Accuracy : 0.98

Классификатор SVM
С помощью стандартного масштабатора SVM получил самую низкую точность, которая составляет 0,84.

model = SVC(gamma=’auto’)
model.fit(X_train, y_train)
target_pred = model.predict(X_test)
acc=(accuracy_score(y_test,target_pred))
print(‘Accuracy : ‘,acc)
Out
Accuracy : 0.8425

Без стандартного скейлера SVM получил удивительно высокую точность, которая составляет 0,975.

model = SVC(gamma='auto')
model.fit(X_t, y_t)
target_pred = model.predict(X_t2)
acc=(accuracy_score(y_t2,target_pred))
print('Accuracy : ',acc)
Out
Accuracy : 0.975

Вывод

Используя набор данных диабета по 4 алгоритмам, можно сделать вывод, что:

  1. Данные этого набора данных несбалансированы, поэтому была применена техника избыточной выборки.
  2. На K-ближайших соседей и дерево решений не повлияла нормализация с использованием стандартного масштабатора.
  3. Многослойный персептрон получил лучшую точность, используя нормализованные данные.
  4. Методы опорных векторов получили более низкую точность при использовании нормализованных данных.

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

Полный код доступен на странице https://github.com/160shelf/comparing-ml-algorithms.git.