SVM scikitlearn的规范化或标准化数据输入

时间:2015-04-23 09:35:59

标签: python scikit-learn svm

正如主题所说,我在规范化方面遇到了一些麻烦 scikitlearn中SVM回归数据集的标准化。

我的问题是:

  1. 当我想搜索SVM的参数时(Cgamma 例如)我使用这段代码:

    param_grid = [
      {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
      {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
     ]
    
    svr = svm.SVC()
    clf = grid_search.GridSearchCV(svr, param_grid)
    clf.fit(X_train,TargetT)
    

    我应该标准化X_train函数中的TargetTfit向量吗?

    X_train包含介于-1和1之间的值,TargetT是0的向量 和1表示平均值不等于0且std不等于1.

  2. 我尝试使用preprocessing.StandardScaler()功能 InputTrainingInputValidation数据集,但是当我检查时 平均值我有每个特征的值不等于0( 订单是e-14),std类似于1.00000985。就是它 正常或我做错了什么?我想使用缩放 数据集作为SVM的输入作为代码belove:

    scalerI = preprocessing.StandardScaler()
    X_train = scalerI.fit_transform(InputT)
    X_test = scalerI.transform(InputCross)
    svr = SVR(kernel='rbf', epsilon=0.01, C=100, gamma = 0.01)
    y_rbf = svr.fit(X_train,TargetT)
    y_hat=svr.predict(X_test)
    
  3. 非常感谢。

1 个答案:

答案 0 :(得分:3)

  1. 只有输入要素X_train需要标准化,而不是目标变量,它应该是分类任务的整数值(例如,用于二进制分类的0和1的数组)或字符串标签(例如'spam' vs 'ham')。对于回归任务(预测连续变量,如摄氏温度或美元价格),它有时可以帮助标准化目标,但这通常没有标准化输入功能那么有用。

  2. 1e-14足够接近0.0且1.00000985足够接近1.0。

  3. 作为一个方面,您可以使用管道缩短代码:

    from sklearn.pipeline import make_pipeline
    pipeline = make_pipeline(
        preprocessing.StandardScaler(),
        SVR(kernel='rbf', epsilon=0.01, C=100, gamma = 0.01),
    )
    pipeline.fit(X_train, TargetT)
    y_hat = pipeline.predict(X_test)
    

    要网格搜索此类管道的内在模型的参数,您必须使用该类型的小写版本作为前缀:例如: 'svr__C''svr__gamma''svr__epsilon'