我想知道如何在python中使用交叉验证来提高逻辑回归模型的准确性。正在使用的数据集称为“虹膜”。我已经成功地对SVM模型使用了交叉验证,但我正在努力调整我的代码以对逻辑回归模型做同样的事情。到目前为止,这是我的代码:
from sklearn import cross_validation
from sklearn import datasets, linear_model
iris = datasets.load_iris()
x_iris = iris.data
y_iris = iris.target
svc = svm.SVC(C=1, kernel='linear')
k_fold = cross_validation.StratifiedKFold(y_iris, n_folds=10)
# labels, the number of folders
#for train, test in k_fold:
# print train, test
scores = cross_validation.cross_val_score(svc, x_iris, y_iris, cv=k_fold, scoring='accuracy')
# clf.fit() is repeatedly called inside the cross_validation.cross_val_score()
print scores
print 'average score = ', np.mean(scores)
print 'std of scores = ', np.std(scores)
我必须对代码进行哪些调整才能实现逻辑回归模型的成功交叉验证?
感谢您的帮助。
答案 0 :(得分:2)
lg = LogisticRegression()
scores = cross_validation.cross_val_score(lg, x_iris, y_iris, cv=k_fold,scoring='accuracy')
print scores
print 'average score = ', np.mean(scores)
print 'std of scores = ', np.std(scores)
使用默认值分类器创建LogisticRegression
对我来说很好。输出略低于SVM
机器方法,0.953333333333
与0.973333333333
。
但是对于参数调整,您始终可以使用GridSearchCV
自动执行cv
折叠的交叉验证(在下一个示例中,我将使用10
你正在尝试所有可能的参数组合。例如:
from sklearn import grid_search
parameters = {
'penalty':['l2'],
'C':[1,10,100],
'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag'],
}
GS = grid_search.GridSearchCV(lg, parameters,cv=10,verbose=10)
GS.fit(x_iris,y_iris)
print GS.best_params_ # output: {'penalty': 'l2', 'C': 100, 'solver': 'liblinear'}
print GS.best_score_ # output: 0.98
通过这样做,创建具有最佳参数LogisticRegression(penalty='l2',C=100,solver='liblinear')
的分类器将为您提供0.98
准确度。
温和警告:执行交叉验证时,您最好将部分数据保存用于测试目的,但未包含在学习过程中。否则,您的学习算法会以某种方式看到所有数据,您很容易陷入过度拟合之中。