如何解决如果我在整个数据集上使用 StandardScaler,fit 还是 fit_transform?
我有一个名为 features 的数据框,我按如下方式缩放数据:
col_names=features.columns
scaler=StandardScaler()
scaler.fit(features)
standardized_features=scaler.transform(features)
standardized_features.shape
df=pd.DataFrame(data=standardized_features,columns=col_names)
然后我将训练和测试集拆分如下:
df_idx = df[df.Date == '1996-12-01'].index[0]
df_targets=df['Label'].values
df_features=df.drop(['Regime','Date','Label'],axis=1)
df_training_features = df.iloc[:df_idx,:].drop(['Regime',axis=1)
df_validation_features = df.iloc[df_idx:,axis=1)
df_training_targets = df['Label'].values
df_training_targets=df_training_targets[:df_idx]
df_validation_targets = df['Label'].values
df_validation_targets=df_validation_targets[df_idx:]
最后我测试了不同的方法:
scoring='f1'
kfold = model_selection.TimeSeriessplit(n_splits=5)
models = []
models.append(('LR',LogisticRegression(C=1e10,class_weight = 'balanced')))
models.append(('KNN',KNeighborsClassifier()))
models.append(('GB',GradientBoostingClassifier(random_state = 42)))
models.append(('ABC',AdaBoostClassifier(random_state = 42)))
models.append(('RF',RandomForestClassifier(class_weight = 'balanced')))
models.append(('XGB',xgb.XGBClassifier(objective='binary:logistic',booster='gbtree')))
results = []
names = []
lb = preprocessing.LabelBinarizer()
for name,model in models:
cv_results = model_selection.cross_val_score(estimator = model,X = df_training_features,y = lb.fit_transform(df_training_targets),cv=kfold,scoring = scoring)
model.fit(df_training_features,df_training_targets) # train the model
fpr,tpr,thresholds= metrics.roc_curve(df_training_targets,model.predict_proba(df_training_features)[:,1])
auc = metrics.roc_auc_score(df_training_targets,model.predict(df_training_features))
plt.plot(fpr,label='%s ROC (area = %0.2f)' % (name,auc))
results.append(cv_results)
names.append(name)
msg = "%s: %f (%f)" % (name,cv_results.mean(),cv_results.std())
print(msg)
我的问题是:
- 如果最初我使用 StandardScaler 缩放我的数据,那么在最后一部分中我使用 fit_transform 而不是 fit 作为 model_selection.cross_val_score 的 y 参数是否正确?为什么?
- 对于预测,我应该简单地使用 model.predict(df_validation_features) 吗?
解决方法
您必须仅使用训练数据来拟合 StandScaler。然后,通过这种标准化,您可以转换训练数据 a 和验证数据。
这样做是为了对所有输入数据保持相同的标准化。想象一下,在您的训练数据中,您有一个属性的下一个值:[0,1,2]
。如果您进行简单的归一化(类似于标准化),您将获得如下结果:[0,0.5,1]
。
现在假设在您的验证中您还有 3 个样本,其中一个类别具有下一个值 [0,100]
。如果你适应和转变,你会[0,0.01,1]
。这是一场灾难,因为模型被训练认为你的 1 是 0.5 缩放。这就是您使用训练数据信息转换验证数据的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。