web-dev-qa-db-fra.com

Paramètres de réglage fin dans la régression logistique

J'exécute une régression logistique avec un tf-idf exécuté sur une colonne de texte. C'est la seule colonne que j'utilise dans ma régression logistique. Comment puis-je m'assurer que les paramètres pour cela sont réglés aussi bien que possible?

Je voudrais pouvoir exécuter une série d'étapes qui me permettraient finalement de dire que mon classificateur de régression logistique fonctionne aussi bien que possible.

from sklearn import metrics,preprocessing,cross_validation
from sklearn.feature_extraction.text import TfidfVectorizer
import sklearn.linear_model as lm
import pandas as p
loadData = lambda f: np.genfromtxt(open(f, 'r'), delimiter=' ')

print "loading data.."
traindata = list(np.array(p.read_table('train.tsv'))[:, 2])
testdata = list(np.array(p.read_table('test.tsv'))[:, 2])
y = np.array(p.read_table('train.tsv'))[:, -1]

tfv = TfidfVectorizer(min_df=3, max_features=None, strip_accents='unicode',
                      analyzer='Word', token_pattern=r'\w{1,}', 
                      ngram_range=(1, 2), use_idf=1, smooth_idf=1, 
                      sublinear_tf=1)

rd = lm.LogisticRegression(penalty='l2', dual=True, tol=0.0001, 
                           C=1, fit_intercept=True, intercept_scaling=1.0, 
                           class_weight=None, random_state=None)

X_all = traindata + testdata
lentrain = len(traindata)

print "fitting pipeline"
tfv.fit(X_all)
print "transforming data"
X_all = tfv.transform(X_all)

X = X_all[:lentrain]
X_test = X_all[lentrain:]

print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rd, X, y, cv=20, scoring='roc_auc'))

print "training on full data"
rd.fit(X, y)
pred = rd.predict_proba(X_test)[:, 1]
testfile = p.read_csv('test.tsv', sep="\t", na_values=['?'], index_col=1)
pred_df = p.DataFrame(pred, index=testfile.index, columns=['label'])
pred_df.to_csv('benchmark.csv')
print "submission file created.."
16
Simon Kiely

Vous pouvez utiliser la recherche dans la grille pour trouver la meilleure valeur C pour vous. Plus petit C spécifie une régularisation plus forte.

>>> param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000] }
>>> clf = GridSearchCV(LogisticRegression(penalty='l2'), param_grid)
GridSearchCV(cv=None,
             estimator=LogisticRegression(C=1.0, intercept_scaling=1,   
               dual=False, fit_intercept=True, penalty='l2', tol=0.0001),
             param_grid={'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]})

Voir le document GridSearchCv pour plus de détails sur votre application.

20
lennon310

La recherche dans la grille est un moyen brutal de trouver les paramètres optimaux car elle entraîne et teste toutes les combinaisons possibles. La meilleure façon est d'utiliser l'optimisation bayésienne qui apprend le score d'évaluation passé et prend moins de temps de calcul.

2
viplov