【问题标题】:SKLearn - Principal Component Analysis leads to horrible results in knn predictionsSKLearn - 主成分分析导致 knn 预测的可怕结果
【发布时间】:2014-02-15 08:35:24
【问题描述】:

通过将 PCA 添加到算法中,我正在努力提高 kaggle 数字识别教程的 %96.5 SKlearn kNN 预测分数,但基于 PCA 输出的新 kNN 预测结果非常糟糕,例如 23%。

以下是完整代码,如果您指出我的错误之处,我将不胜感激。

import pandas as pd
import numpy as np
import pylab as pl
import os as os
from sklearn import metrics
%pylab inline
os.chdir("/users/******/desktop/python")

traindata=pd.read_csv("train.csv")
traindata=np.array(traindata)
traindata=traindata.astype(float)
X,y=traindata[:,1:],traindata[:,0]

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test= train_test_split(X,y,test_size=0.25, random_state=33)

#scale & PCA train data
from sklearn import preprocessing
from sklearn.decomposition import PCA
X_train_scaled = preprocessing.scale(X_train)
estimator = PCA(n_components=350)
X_train_pca = estimator.fit_transform(X_train_scaled)

# sum(estimator.explained_variance_ratio_) = 0.96

from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=6)
neigh.fit(X_train_pca,y_train)

# scale & PCA test data
X_test_scaled=preprocessing.scale(X_test)
X_test_pca=estimator.fit_transform(X_test_scaled)

y_test_pred=neigh.predict(X_test_pca)
# print metrics.accuracy_score(y_test, y_test_pred) = 0.23
# print metrics.classification_report(y_test, y_test_pred)

【问题讨论】:

    标签: python scikit-learn pca knn kaggle


    【解决方案1】:

    当您处理测试数据时,您使用了fit_transform(X_test),它实际上对测试数据重新计算了另一个 PCA 转换。您应该使用transform(X_test),以便测试数据与训练数据进行相同的转换。

    代码部分看起来像(感谢 ogrisel 提供的whiten 提示):

    estimator = PCA(n_components=350, whiten=True)
    X_train_pca = estimator.fit_transform(X_train)
    X_test_pca = estimator.transform(X_test)
    

    试试看有没有用?

    【讨论】:

    • 也不需要缩放 PCA 转换的数据。可以将 whiten=True 参数传递给 PCA 构造函数以获得相同的结果。
    • 各位大佬,在两个回复之后,代码修改如下:estimator = PCA(n_components=350,whiten=True) estimator.fit(X_train) X_train_pca=estimator.transform(X_train) .... estimator.fit(X_test) X_test_pca=estimator.transform(X_test) 但预测分数下降到 11%。有什么建议吗? (对不起,我无法为 cmets 添加换行符
    • 正如您再次 estimator.fit(X_test) 所做的那样,您的新代码仍在以不同的方式转换训练和测试数据,即与原始版本大致相同。对于 PCA 变压器,应该只调用一次 fit
    【解决方案2】:

    你必须:

    1. 在训练集上拟合和变换(使用 .fit_transfrom
    2. 并且仅在您的测试集上进行转换(使用 .transform)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-31
      • 2015-09-04
      • 2021-07-26
      • 2017-10-11
      • 2018-12-18
      • 2018-02-01
      • 2016-08-20
      • 2015-08-11
      相关资源
      最近更新 更多