В этом посте я пытаюсь сравнить производительность различных классификаторов машинного обучения, предоставляемых библиотекой Scikit Learn. Я пытаюсь сравнить производительность K-ближайших соседей, многослойного персептрона, дерева решений и машин опорных векторов при классификации набора данных о диабете, который я скачал с Kaggle.
Данные
Набор данных, который я использую здесь, — это набор данных о диабете индейцев пима от Kaggle. Давайте сначала посмотрим на набор данных.
- Форма данных
Данные состоят из 2000 строк и 9 столбцов. Последний столбец («Результат») — это категория, содержащая только 2 класса: 0 и 1. - Распределение классов
Классы 0 и 1 распределены неравномерно. Класс 0 состоит из 1306 экземпляров, а класс 1 состоит только из 684 экземпляров. - Корреляция классов
Используя функцию corr(), мы видим, что функции не сильно коррелируют с классом «Результат». Признак «Глюкоза» имеет самую высокую корреляцию с классом с 0,45. - 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 алгоритмам, можно сделать вывод, что:
- Данные этого набора данных несбалансированы, поэтому была применена техника избыточной выборки.
- На K-ближайших соседей и дерево решений не повлияла нормализация с использованием стандартного масштабатора.
- Многослойный персептрон получил лучшую точность, используя нормализованные данные.
- Методы опорных векторов получили более низкую точность при использовании нормализованных данных.
Я рекомендую вам использовать перекрестную проверку, чтобы получить более точную точность, а также использовать другие показатели производительности, такие как отзыв и точность, для дальнейшего анализа.
Полный код доступен на странице https://github.com/160shelf/comparing-ml-algorithms.git.