Sto usando scikit-learn con un CV stratificato per confrontare alcuni classificatori. Sto calcolando: precisione, richiamo, auc.Random Forest sta sovralimentando
Ho usato per l'ottimizzazione dei parametri GridSearchCV con un 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)
sono i migliori_parami di GridSearchCV.
Il mio problema, penso di essere davvero troppo sexy. Per esempio:
a caso Foresta con deviazione standard (+/-)
- precisione: 0.99 (+/- 0,06)
- sensibilità: 0.94 (+/- 0,06)
- specificità : 0.94 (+/- 0,06)
- B_accuracy: 0.94 (+/- 0,06)
- AUC: 0.94 (+/- 0,11)
regressione logistica con deviazione standard (+/-)
- precisione: 0.88 (+/- 0,06)
- sensibilità: 0,79 (+/- 0,06)
- specificità: 0.68 (+/- 0,06)
- B_accuracy: 0.73 (+/- 0,06)
- AUC: 0.73 (+/- 0,041)
E anche gli altri sembrano una regressione logistica (quindi non sembrano sovradimensionati).
Il mio codice per la CV è:
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"
Se sto usando il metodo scores = cross_validation.cross_val_score(clf, X, y, cv=10, scoring='accuracy')
, non ottengo questi valori "sovradattamento". Quindi forse c'è qualcosa di sbagliato nel metodo CV che sto usando? Ma è solo per RF ...
Ho fatto il mio grazie al ritardo della funzione di punteggio di specificità nella funzione cross_val_.
E la domanda è ...? –
Non * crossizza * una foresta casuale. Piuttosto, la foresta viene convalidata in croce mentre viene costruita. –
Ma come devo confrontare i modelli? So che sta per essere convalidato, ma in qualche modo dovrei confrontarlo con altri metodi come SVM, regressione logistica e così via ... La mia ricerca è anche: perché sto sovraffaticando? è la parte con "per train_index, test_index in skf:" l'intero ciclo potrebbe essere sbagliato? perché come ho già detto, la funzione scorer_val fornisce valori "normali" – auronsen