SVM scikit 学习的归一化或标准化数据输入
Normalization or standardization data input for SVM scikitlearn
正如题主所说,我在规范化方面遇到了一些麻烦,
scikitlearn 中 SVM 回归数据集的标准化。
我的问题是:
当我想搜索 SVM 的参数时(C
和 gamma
例如),我使用此代码:
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)
我应该在 fit
函数中标准化 X_train
和 TargetT
向量吗?
X_train
包含 -1 和 1 之间的值,TargetT
是 0 的向量
和 1 均值不等于 0 且 std
不等于 1.
我尝试使用 preprocessing.StandardScaler()
函数
InputTraining
和 InputValidation
数据集,但是当我检查
每个特征的均值不等于 0(
order 是 e-14),std 类似于 1.00000985。就是它
正常还是我做错了什么?我想使用缩放
数据集作为 SVM 的输入,代码如下:
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)
非常感谢。
只有输入特征 X_train
需要标准化,而不是目标变量,目标变量应该是 class化任务的整数值(例如,0 和 1 的数组二进制 class 化)或字符串标签(例如 'spam'
与 'ham'
)。对于回归任务(预测连续变量,如摄氏温度或美元价格),有时可以帮助标准化目标,但这通常不如标准化输入特征有用。
1e-14 足够接近 0.0,1.00000985 足够接近 1.0。
另一方面,您可以使用管道来缩短代码:
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)
要网格搜索此类管道的内部模型的参数,您必须使用 class 名称的小写版本作为前缀:例如'svr__C'
、'svr__gamma'
和 'svr__epsilon'
。
正如题主所说,我在规范化方面遇到了一些麻烦, scikitlearn 中 SVM 回归数据集的标准化。
我的问题是:
当我想搜索 SVM 的参数时(
C
和gamma
例如),我使用此代码: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)
我应该在
fit
函数中标准化X_train
和TargetT
向量吗?X_train
包含 -1 和 1 之间的值,TargetT
是 0 的向量 和 1 均值不等于 0 且std
不等于 1.我尝试使用
preprocessing.StandardScaler()
函数InputTraining
和InputValidation
数据集,但是当我检查 每个特征的均值不等于 0( order 是 e-14),std 类似于 1.00000985。就是它 正常还是我做错了什么?我想使用缩放 数据集作为 SVM 的输入,代码如下: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)
非常感谢。
只有输入特征
X_train
需要标准化,而不是目标变量,目标变量应该是 class化任务的整数值(例如,0 和 1 的数组二进制 class 化)或字符串标签(例如'spam'
与'ham'
)。对于回归任务(预测连续变量,如摄氏温度或美元价格),有时可以帮助标准化目标,但这通常不如标准化输入特征有用。1e-14 足够接近 0.0,1.00000985 足够接近 1.0。
另一方面,您可以使用管道来缩短代码:
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)
要网格搜索此类管道的内部模型的参数,您必须使用 class 名称的小写版本作为前缀:例如'svr__C'
、'svr__gamma'
和 'svr__epsilon'
。