Я пытаюсь сравнить классификаторы RandomForest (RF), SupportVectorMachine (SVM) и Multilayer Perceptron (MLP), глядя на их classification_report
. Это мультиклассификация по категориальным данным.
Те же данные (378443 записей, 7 столбцов)
то же самое,
тот же y_test ,.
Я проверил мой y_train и y_test с:
from collections import Counter
Counter(y_train)
Counter(y_test)
Я вижу, что у обоих одинаковые 31 класс.
OUTPUT Counter(y_train): OUTPUT Counter(y_test)
Counter({'Class 1': 201096, Counter({'Class 1': 133917,
'Class 2': 24109, 'Class 11': 5,
'Class 3': 731, 'Class 2': 16167,
'Class 4': 851, 'Class 3': 475,
'Class 5': 60, 'Class 4': 628,
'Class 6': 7, 'Class 8': 7,
'Class 7': 19, 'Class 12': 19,
'Class 8': 3, 'Class 21': 3,
'Class 9': 12, 'Class 25': 10,
'Class 10': 7, 'Class 18': 6,
'Class 11': 5, 'Class 9': 12,
'Class 12': 28, 'Class 5': 41,
'Class 13': 5, 'Class 16': 4,
'Class 14': 8, 'Class 7': 14,
'Class 15': 9, 'Class 17': 3,
'Class 16': 6, 'Class 30': 3,
'Class 17': 7, 'Class 26': 4,
'Class 18': 4, 'Class 27': 4,
'Class 19': 6, 'Class 14': 2,
'Class 20': 5, 'Class 28': 5,
'Class 21': 7, 'Class 13': 5,
'Class 22': 6, 'Class 24': 9,
'Class 23': 7, 'Class 15': 7,
'Class 24': 15, 'Class 31': 5,
'Class 25': 10, 'Class 10': 3,
'Class 26': 10, 'Class 23': 3,
'Class 27': 6, 'Class 29': 1,
'Class 28': 5, 'Class 22': 4,
'Class 29': 9, 'Class 20': 5,
'Class 30': 7, 'Class 6': 3,
'Class 31': 5}) 'Class 19': 4})
Но я получаю это предупреждение, когда печатаюlass_report (y_train, y_pred):
UndefinedMetricWarning: точность и F-оценка плохо определены и
устанавливается на 0,0 в метках без прогнозируемых выборок. «Точность»,
«прогнозируемый», средний, warn_for)
, что означает, что не все метки включены в y_pred, то есть в y_test есть некоторые метки, которые классификатор никогда не предсказывает.
С помощью RF все работает хорошо (только один класс получает 0,00 вification_report для точности и отзыва).
Классификационный отчет SVM и MLP содержит 0,00 с в половине классов.
MLP может предсказать 13 классов (более 0,00 в точности / отзыве): class 1,2,3,4, 6, 8,9, 12, 14, 20,21, 23, 25
.
Весь мой код:
#data is imported
Y = data['class']
data=data.drop['class']
labEn = {}
#LabelEncoding for cols
for x in range(len(data.columns)):
#creating the LabelEncoder for col x
labEn[x] = LabelEncoder()
dfPre[data.columns[x]] = labEn[x].fit_transform(data[data.columns[x]])
#for unknown labels
labEn[x].classes_ = np.append(labEn[x].classes_, '-unknown-')
X = data
X.shape #Output:(378443, 7)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)
###### amount of train and test data####################
X_train.shape, y_train.shape
#Output: (227065, 7)
(227065,)
X_test.shape, y_test.shape
#Output: (151378, 7)
(151378,)
from collections import Counter
print(Counter(y_train))
print(Counter(y_test))
##RF
rfclf = RandomForestClassifier(class_weight = 'balanced')
rfclf.fit(X_train, y_train)
y_train_pred = cross_val_predict(rfclf, X_train, y_train, cv=3)
y_test_pred=cross_val_predict(rfclf, X_test, y_test, cv=3)
print(classification_report(y_train, y_train_pred))
print(classification_report(y_test, y_test_pred))
##for SVM and MLP: Scaling data
start_time_standardscaler = time.time()
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled=scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
#for svm: One Hot Encoder - I also tried it without!
enc = OneHotEncoder(handle_unknown='ignore')
enc.fit(X_train_scaled)
X_train_X_test_ohencoded=enc.transform(X_train_scaled)
X_test_ohencoded=enc.transform(X_test_scaled)
##SVM
svmclf=svm.SVC(kernel='rbf', gamma='scale')
svmclf.fit(X_train_scaled,y_train)#also tried X_train_ohencoded,y_train)
y_train_pred_scaled = cross_val_predict(svmclf, X_train_scaled, y_train, cv=10)
#y_train_pred_ohencoded = cross_val_predict(svmclf, X_train_ohencoded, y_train, cv=10)
print(classification_report(y_train, y_train_pred_scaled))
#print(classification_report(y_train, y_train_pred_ohencoded))
print(classification_report(y_test, y_test_pred))
#print(classification_report(y_test, y_test_pred_ohencoded))
##MLP
mlpclf = MLPClassifier(solver='adam', alpha=1e-5, hidden_layer_sizes=(50, 100), random_state=1)
mlpclf.fit(X_train_scaled,y_train)
y_train_pred = cross_val_predict(mlpclf, X_train_scaled, y_train, cv=10)
y_test_pred=cross_val_predict(rfclf, X_test_scaled, y_test, cv=3)
print(classification_report(y_train, y_train_pred))
print(classification_report(y_test, y_test_pred))
##Prediction
#works well since the 5 classes all classifiers could train has to be predicted here (how lucky)
#newdata is imported
#Scaler from above is used
newdata_scaled=scaler.transform(newdata)
#Encoder from above is used
newdata_enc=enc.transform(newdata_scaled)
rfclf.predict(newdata)
svmclf.predict(newdata_enc)
mlpclf.predict(newdata_scaled)