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

Данните

Наборът от данни, който използвам тук, е наборът от данни за диабета на индианците Pima от 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 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-те алгоритъма, може да се заключи, че:

  1. Данните от този набор от данни са небалансирани, така че е извършена техника за свръхсемплиране
  2. K-най-близките съседи и дървото на решенията не бяха засегнати от нормализирането с помощта на стандартен скалер
  3. Multi-Layer Perceptron получи по-добра точност, използвайки нормализираните данни
  4. Support Vector Machines получиха по-ниска точност, използвайки нормализираните данни

Препоръчвам ви да използвате кръстосано валидиране, за да получите по-точна точност, като използвате и други показатели за ефективност, като припомняне и прецизност за по-нататъшен анализ.

За пълния код, моля посетете https://github.com/160shelf/comparing-ml-algorithms.git