首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Sckit的fit_transform会导致准确性和所有其他评估指标的大幅下降?

为什么Sckit的fit_transform会导致准确性和所有其他评估指标的大幅下降?
EN

Data Science用户
提问于 2019-01-15 21:19:37
回答 2查看 752关注 0票数 2

试图使用sc.fit_transform(X),我得到了一个巨大的精度下降在同一型号。在不缩放数据集值的情况下,我得到了80 %- 82%的精度值。当我试图对它们进行缩放时,使用sc.fit_transform(X),我得到了70 %- 74%的精度值.

为什么会有这么大的准确性下降呢?

编辑:

下面是我使用的代码:

代码语言:javascript
复制
# read the dataset file
basic_df = pd.read_csv('posts.csv', sep=';', encoding = 'ISO-8859-1', parse_dates=[2], dayfirst=True) 

# One-Hot-Encoding for categorical (strings) features
basic_df = pd.get_dummies(basic_df, columns=['industry', 'weekday', 'category_name', 'page_name', 'type']) 

# bring the label column to the end 
cols = list(basic_df.columns.values) # Make a list of all of the columns in the df
cols.pop(cols.index('successful')) # Remove target column from list
basic_df = basic_df[cols+['successful']] # Add it at the end of dataframe

dataset = basic_df.values

# separate the data from the labels 
X = dataset[:,0:45].astype(float)
Y = dataset[:,45]

#standardizing the input feature
X = sc.fit_transform(X)

# evaluate model with standardized dataset
#estimator = KerasClassifier(build_fn=create_baseline, epochs=5, batch_size=5, verbose=0)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=seed)
#estimator.fit(X_train, Y_train)
#predictions = estimator.predict(X_test)
#list(predictions)

# build the model 
model = Sequential()
model.add(Dense(100, input_dim=45, kernel_initializer='normal', activation='relu'))
model.add(Dense(50, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))

# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
history = model.fit(X_train, Y_train, validation_split=0.3, epochs=500, batch_size=10)

代码中有一部分是注释的,因为我在开始时尝试使用KerasClassifier。但是,当我使用fit_transform(X)时,这两种方法的准确性都要低得多(如上面所述)。在不使用fit_transform(X)的情况下,我得到了80 %- 82%的准确度。没有70 %- 74%。怎么会这样?我做错什么了吗?缩放输入数据并不总是带来更好(或几乎相同的准确性结果)和主要更快的拟合吗?为什么在使用它的时候,准确度会有这么大的下降?

PS:' sc‘是StandardScaler() ->sc= StandardScaler()

下面是使用的dataframe (在2张照片中,因为它太宽而不能在一张照片中截图),列“成功”作为标签列:

EN

回答 2

Data Science用户

发布于 2019-01-16 18:04:00

没有看到实际数据,很难说出来。

我确实有一个推测,当对所有数据使用定标器(在火车/测试拆分之前)时,您会创建一个数据泄漏。

也就是说,模型拟合器不应该看到的一些数据(测试集)实际上包括在火车组中(因为定标者看到了它,如果用于设置天平的话)。

这种数据泄漏会导致过度拟合,从而降低精度评分。

尝试在每个火车/测试分割上执行比例部分(在火车上使用fit_transform,在测试上只进行转换)。对于模型研究来说,这是一个更好的实践,而且显然更接近于经过训练的模型将如何现场执行(在尚未看到的数据上)。

票数 1
EN

Data Science用户

发布于 2019-01-17 12:04:27

请提前停车。我们不能在开始的时候选择一些时代和一些超参数,然后改变(转换)数据,然后等待看到发生了什么。如果您的声明,标准化输入数据通常是在一个更快的拟合模型是正确的(这是预期的),模型也应该适应得更快。你应该监督你的学习,并抓住最好的时代,你的模式适合。您可以这样做:

定义早期停止:

代码语言:javascript
复制
from keras.callbacks import EarlyStopping
es = EarlyStopping(monitor='val_acc',
                              min_delta=0,
                              patience=20,
                              verbose=0, mode='auto',restore_best_weights=True)

然后将其添加到您的培训中如下:

代码语言:javascript
复制
model.fit(X_train, Y_train, validation_split=0.3, epochs=500, batch_size=10,callbacks=[es])

你可以设定早停的参数。早期停止允许您停止您的模型性能开始下降的地方,因为过度拟合。通过选择restore_best_weights=True,您还可以在停止时以最佳性能从时代恢复模型。它也会缩短你的训练时间,因为它可能会停在某个地方。

有关早期停止的更多细节,请查看:https://stackoverflow.com/questions/43906048/keras-early-stopping

此外,您还可以使用批规范化,不仅规范输入,而且规范神经网络隐藏层之间的中间张量。

代码语言:javascript
复制
model = Sequential()
model.add(Dense(100, input_dim=45, kernel_initializer='normal', activation='relu'))
model.add(BatchNormalization())
model.add(Dense(50, kernel_initializer='normal', activation='relu'))
model.add(BatchNormalization())
model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))

这将提高您的拟合速度,而它也将有一个轻微的正则化效果。

更深入的见解(BatchNorm文件):https://arxiv.org/pdf/1502.03167.pdf

最后,为了回答问题的具体核心,您需要规范化数据,而不是在上下文中标准化数据。这通常取决于激活函数,ReLU可以很好地实现规范化。在标准化之前,不要忘记分离训练和测试集;正如我所观察到的,您可以立即完成它们。这是造成数据泄漏的好方法。您可以使用以下配置:

代码语言:javascript
复制
from sklearn.preprocessing import Normalizer
transformer = Normalizer().fit(x_train)
x_train = transformer.transform(x_train)
transformer = Normalizer().fit(x_test)
x_test = transformer.transform(x_test)

希望我能帮忙,祝你好运!

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/44060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档