Używam naukowego scikit z uwarstwionym CV, aby porównać niektóre klasyfikatory. Obliczam: dokładność, przypomnienie, auc.Losowy las jest overfitting
Użyłem do optymalizacji parametrów GridSearchCV z 5 CV.
RandomForestClassifier(warm_start= True, min_samples_leaf= 1, n_estimators= 800, min_samples_split= 5,max_features= 'log2', max_depth= 400, class_weight=None)
to najlepsze_paramy z GridSearchCV.
Mój problem, myślę, że naprawdę nadwyrężam. Na przykład:
Losowy las z odchyleniem standardowym (+/-)
- precyzja: 0,99 (+/- 0,06)
- czułość: 0,94 (+/- 0,06)
- specyficzności : 0,94 (+/- 0,06)
- B_accuracy: 0,94 (+/- 0,06)
- AUC: 0,94 (+/- 0,11)
regresja logistyczna z odchyleniem standardowym (+/-)
- Dokładność: 0,88 (+/- 0,06)
- czułość: 0,79 (+/- 0,06)
- specyficzność: 0,68 (+/- 0,06)
- B_accuracy: 0,73 (+/- 0,06)
- AUC: 0,73 (+/- 0,041)
A pozostałe również wyglądają jak regresja logistyczna (więc nie wyglądają na przestarzałe).
Moje CV jest kod:
for i,j in enumerate(data):
X.append(data[i][0])
y.append(float(data[i][1]))
x=np.array(X)
y=np.array(y)
def SD(values):
mean=sum(values)/len(values)
a=[]
for i in range(len(values)):
a.append((values[i]-mean)**2)
erg=sum(a)/len(values)
SD=math.sqrt(erg)
return SD,mean
for name, clf in zip(titles,classifiers):
# go through all classifiers, compute 10 folds
# the next for loop should be 1 tab indent more, coudlnt realy format it here, sorry
pre,sen,spe,ba,area=[],[],[],[],[]
for train_index, test_index in skf:
#print train_index, test_index
#get the index from all train_index and test_index
#change them to list due to some errors
train=train_index.tolist()
test=test_index.tolist()
X_train=[]
X_test=[]
y_train=[]
y_test=[]
for i in train:
X_train.append(x[i])
for i in test:
X_test.append(x[i])
for i in train:
y_train.append(y[i])
for i in test:
y_test.append(y[i])
#clf=clf.fit(X_train,y_train)
#predicted=clf.predict_proba(X_test)
#... other code, calculating metrics and so on...
print name
print("precision: %0.2f \t(+/- %0.2f)" % (SD(pre)[1], SD(pre)[0]))
print("sensitivity: %0.2f \t(+/- %0.2f)" % (SD(sen)[1], SD(pre)[0]))
print("specificity: %0.2f \t(+/- %0.2f)" % (SD(spe)[1], SD(pre)[0]))
print("B_accuracy: %0.2f \t(+/- %0.2f)" % (SD(ba)[1], SD(pre)[0]))
print("AUC: %0.2f \t(+/- %0.2f)" % (SD(area)[1], SD(area)[0]))
print "\n"
Jeśli używam metody scores = cross_validation.cross_val_score(clf, X, y, cv=10, scoring='accuracy')
, ja nie rozumiem tego „przeuczenia” wartości. Więc może jest coś nie tak z metodą CV, której używam? Ale to tylko dla RF ...
Zrobiłem własne z powodu opóźnienia funkcji oceny specyficzności w funkcji cross_val_function.
I pytanie jest ...? –
Czynisz * nie * krzyżujesz walidację losowego lasu. Przeciwnie, las jest sprawdzany krzyżowo podczas budowy. –
Ale jak mam porównać modele? Wiem, że jest sprawdzany krzyżowo, ale jakoś powinienem go porównać z innymi metodami, takimi jak SVM, regresja logistyczna itd. Moim zadaniem jest również: dlaczego nadrabiam? jest częścią z "dla train_index, test_index w skf:" cała pętla może być źle? bo jak wspomniałem, funkcja scorer_val daje "normalne" wartości. – auronsen