sklearn中的模型选择和分层抽样

Posted

技术标签:

【中文标题】sklearn中的模型选择和分层抽样【英文标题】:model selection and stratified sampling in sklearn together 【发布时间】:2016-02-09 07:38:38 【问题描述】:

我正在使用 scikit-learn 来预测模型,同时使用 Kfold 分层抽样和 KNeighborsClassifier。

虚拟数据集是: 将熊猫导入为 pd 将 numpy 导入为 np

data = pd.DataFrame(
    'A' : [4,5,6,7,1,3,4,9,1,8], 'B' : [10,20,30,40,90,55,68,25,19,97],'C' : [100,50,30,89,54,23,13,67,93,84],'y' :[1,1,0,0,0,1,0,1,1,0]).astype(np.float)
data1 = data.drop(['y'],axis = 1, inplace= False)

X = data1.as_matrix().astype(np.float)
X
y = data['y'].as_matrix().astype(np.int)
y

对于Kfold分层抽样,代码为:

from sklearn.cross_validation import StratifiedKFold
def stratifiedkfold_cv(X, y, clf_class, shuffle=True, n_folds=2, **kwargs):
    stratifiedk_fold = StratifiedKFold(y, n_folds=n_folds, shuffle=shuffle)
    y_pred = y.copy()
    for train_index, test_index in stratifiedk_fold:
        X_train, X_test = X[train_index], X[test_index]
        y_train = y[train_index]
        clf = clf_class(**kwargs)
        clf.fit(X_train,y_train)
        y_pred[test_index] = clf.predict(X_test)
    return y_pred 

我正在尝试通过调整参数:n_neighbors 基于 accuracy_score 来拟合最好的 sklearn.neighbors,KNeighborsClassifier。代码是

from sklearn.neighbors import KNeighborsClassifier
k_range = range(1,31)
k_scores = []
for k in k_range:
    knn = KNeighborsClassifier
    y_pred = stratifiedkfold_cv(X, y,knn(n_neighbors = k))
    scores = accuracy_score(y, y_pred)
    k_scores.append(scores.mean())
print(k_scores)

但我得到的错误是: **----> 7 y_pred = stratifiedkfold_cv(X, y,knn(n_neighbors = k)) ----> 7 clf = clf_class(**kwargs) **TypeError: 'KNeighborsClassifier' 对象不可调用******

我相信我与定义为 stratifiedkfold_cv 的函数有些不一致。但我无法弄清楚如何修改它?

【问题讨论】:

如果你能把它转换成minimal reproducible example对我们来说会更容易 您要我提供 X 和 y 的值吗?这会有帮助吗? 您不必提供您的Xy。如果您可以使用较小的玩具数据集重现此错误,我们会更容易。 我添加了一个玩具数据集,我得到的错误和以前一样 你可能想在这里是y_pred = stratifiedkfold_cv(X, y,knn, n_neighbors=k) 【参考方案1】:
def accuracy(y_true,y_pred):
    return np.mean(y_true == y_pred)    

from sklearn.neighbors import KNeighborsClassifier
    k_range = range(1,31)
    k_scores = []
    for k in k_range:
        knn = KNeighborsClassifier
        print accuracy(y, stratifiedkfold_cv(X,y,KNN,n_neighbors=k))   

【讨论】:

以上是关于sklearn中的模型选择和分层抽样的主要内容,如果未能解决你的问题,请参考以下文章

sklearn特征选择和分类模型

防止过拟合的方法 预测鸾凤花(sklearn)

sklearn 逻辑回归中的特征选择

使用 Sklearn 进行蛮力模型选择

sklearn 模型选择和评估

sklearn构建stacking模型进行堆叠多模型分层级回归分析