В тази публикация се опитвам да сравня ефективността на различни класификатори за машинно обучение, предоставени от библиотеката Scikit Learn. Опитвам се да сравня ефективността на K-най-близките съседи, многослойния персептрон, дървото на решенията и машините за поддържащи вектори при класифициране на набор от данни за диабет, който изтеглих от Kaggle.
Данните
Наборът от данни, който използвам тук, е наборът от данни за диабета на индианците Pima от 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 Classifier. Трансформирайте както данните за влака, така и данните за теста.
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 върху ненормализираните данни (данните без нормализиране на стандартния скалер) и не изглежда да е засегнат.
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-най-близките съседи и дървото на решенията не бяха засегнати от нормализирането с помощта на стандартен скалер
- Multi-Layer Perceptron получи по-добра точност, използвайки нормализираните данни
- Support Vector Machines получиха по-ниска точност, използвайки нормализираните данни
Препоръчвам ви да използвате кръстосано валидиране, за да получите по-точна точност, като използвате и други показатели за ефективност, като припомняне и прецизност за по-нататъшен анализ.
За пълния код, моля посетете https://github.com/160shelf/comparing-ml-algorithms.git