将scikit缩放后的数据映射回ID

我有一个pandas.DataFrame,看起来像这样:

In [48]: dfOut[48]:         AMID         A         B         C0  AMID-1000  0.149176  0.768200  0.6893691  AMID-1001  0.169934  0.607390  0.4717882  AMID-1002  0.632052  0.806657  0.9946643  AMID-1003  0.003798  0.382427  0.8948564  AMID-1004  0.182947  0.712373  0.8700685  AMID-1005  0.385039  0.691643  0.5469606  AMID-1006  0.971885  0.169759  0.8043707  AMID-1007  0.443199  0.686212  0.3775568  AMID-1008  0.149402  0.981370  0.5887509  AMID-1009  0.214107  0.264285  0.463403

'AMID'包含数据点的ID,其余每一列都是每个数据点的特征。

我想使用这个数据集来运行一个需要数据缩放的算法,以便每列的mean == 0std == 1。我使用sklearn.preprocessing.StandardScaler来实现这一点,但是为了缩放,我需要从数据集中移除非数值的'AMID'列。

In [61]: from sklearn import preprocessingIn [62]: data = df[[_ for _ in df.columns.values.tolist() if _ not in ['AMID']]]In [64]: scaler = preprocessing.StandardScaler().fit(data)In [65]: data_scaled = scaler.transform(data)In [66]: data_scaledOut[66]: array([[ -6.60180258e-01,   6.63739262e-01,   9.55187160e-02],       [ -5.84458777e-01,   1.47534202e-03,  -9.87448200e-01],       [  1.10128130e+00,   8.22117198e-01,   1.61505880e+00],       [ -1.19049913e+00,  -9.24989864e-01,   1.11828380e+00],       [ -5.36991596e-01,   4.33827828e-01,   9.94906952e-01],       [  2.00212895e-01,   3.48454485e-01,  -6.13293011e-01],       [  2.34094244e+00,  -1.80081691e+00,   6.67913149e-01],       [  4.12372276e-01,   3.26087187e-01,  -1.45646800e+00],       [ -6.59357873e-01,   1.54163661e+00,  -4.05292050e-01],       [ -4.23321269e-01,  -1.41153114e+00,  -1.02918017e+00]])In [67]: data_scaled.mean(axis=0)Out[67]: array([ -8.32667268e-17,  -4.44089210e-17,  -2.88657986e-16])In [68]: data_scaled.std(axis=0)Out[68]: array([ 1.,  1.,  1.])

到目前为止,一切看起来都很好!

现在我可以继续将这些数据输入我的模型,然后用测试数据(也使用相同的缩放器和拟合进行缩放)进行测试。然而,我需要能够准确地看到分类器对每个AMID的预测结果。因此,我在考虑是否应该将缩放后的数据映射回每个数据点的AMID,然后使用分类器的.predict()方法单独尝试每个数据点,或者以某种方式将.predict()的结果映射回AMID列表。

我的第一个想法是将新值分配给原始数据框,像这样:

In [73]: df_copy['A'] = data_scaled[:,0:1]In [74]: df_copyOut[74]:         AMID         A         B         C0  AMID-1000 -0.660180  0.768200  0.6893691  AMID-1001 -0.584459  0.607390  0.4717882  AMID-1002  1.101281  0.806657  0.9946643  AMID-1003 -1.190499  0.382427  0.8948564  AMID-1004 -0.536992  0.712373  0.8700685  AMID-1005  0.200213  0.691643  0.5469606  AMID-1006  2.340942  0.169759  0.8043707  AMID-1007  0.412372  0.686212  0.3775568  AMID-1008 -0.659358  0.981370  0.5887509  AMID-1009 -0.423321  0.264285  0.463403

但我不确定这是否会扭曲原始'AMID'与每列缩放值之间的关联。

有没有更好的方法来做这件事?


回答:

如果我理解正确的话,我会将AMID设置为索引(这样它就不会干扰,并且之后更容易处理),然后在运行时重新创建一个数据框,像这样:

df.set_index('AMID', inplace=True)from sklearn import preprocessingscaler = preprocessing.StandardScaler()df = pd.DataFrame(scaler.fit_transform(df), index=df.index, columns=df.columns)df                  A         B         CAMID                                   AMID-1000 -0.660181  0.663739  0.095517AMID-1001 -0.584459  0.001476 -0.987447AMID-1002  1.101281  0.822116  1.615059AMID-1003 -1.190499 -0.924988  1.118286AMID-1004 -0.536990  0.433827  0.994909AMID-1005  0.200213  0.348455 -0.613294AMID-1006  2.340943 -1.800818  0.667911AMID-1007  0.412372  0.326088 -1.456467AMID-1008 -0.659357  1.541636 -0.405293AMID-1009 -0.423322 -1.411532 -1.029181

如果你希望AMID作为列而不是索引,你可以使用reset_index(),但在我看来,作为索引更好(我假设你之后想要在这个基础上拟合另一个模型…)

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注