【问题标题】:Data type not understood when fitting PCA拟合 PCA 时无法理解数据类型
【发布时间】:2019-06-04 17:41:38
【问题描述】:

我正在对我的数据集中的特征进行降维的主成分分析。但是,当我尝试将模型拟合到我的特征时,我不断遇到此错误消息:

TypeError: 数据类型不理解

这是我的代码:

a = dat.iloc[:,[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
         ,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
         31,32]]
scaler = MinMaxScaler(feature_range=(0, 1))
rescaled = scaler.fit_transform(a)

这是a下的数据示例:

    Time    V1         V2         V3          V4           V5         V6          V7          V8           V9       ...   V22         V23          V24        V25         V26         V27    V28    Amount  Hours   Fraudulent
0   0.0 -1.359807   -0.072781   2.536347    1.378155    -0.338321   0.462388    0.239599    0.098698    0.363787    ... 0.277838    -0.110474   0.066928    0.128539    -0.189115   0.133558    -0.021053   149.62  0   0.206
1   0.0 1.191857    0.266151    0.166480    0.448154    0.060018    -0.082361   -0.078803   0.085102    -0.255425   ... -0.638672   0.101288    -0.339846   0.167170    0.125895    -0.008983   0.014724    2.69    0   0.206
2   1.0 -1.358354   -1.340163   1.773209    0.379780    -0.503198   1.800499    0.791461    0.247676    -1.514654   ... 0.771679    0.909412    -0.689281   -0.327642   -0.139097   -0.055353   -0.059752   378.66  0   0.206
3   1.0 -0.966272   -0.185226   1.792993    -0.863291   -0.010309   1.247203    0.237609    0.377436    -1.387024   ... 0.005274    -0.190321   -1.175575   0.647376    -0.221929   0.062723    0.061458    123.50  0   0.206

这是 a.dtypes 的输出:

Time           float64
V1             float64
V2             float64
V3             float64
V4             float64
V5             float64
V6             float64
V7             float64
V8             float64
V9             float64
V10            float64
V11            float64
V12            float64
V13            float64
V14            float64
V15            float64
V16            float64
V17            float64
V18            float64
V19            float64
V20            float64
V21            float64
V22            float64
V23            float64
V24            float64
V25            float64
V26            float64
V27            float64
V28            float64
Amount         float64
Hours         category
Fraudulent     float64

【问题讨论】:

  • a.dtypes 的输出是什么?
  • @hume 将其添加到我的问题中
  • 问题是category dtype。在调用scaler之前尝试:a.Hours = a.Hours.astype(float)
  • 如果下面的回答有帮助,你能接受吗?谢谢!

标签: python pandas pca


【解决方案1】:

一般来说,scikit-learn 设计用于数字数据类型(整数和浮点数)。通常在 pandas 中,您将拥有 category、对象 (dtype('O'))、datetime64timedelta64 或其他非数字类型。 Pandas 是为分析而设计的,因此会对这些类型“做正确的事”。 Scikit 需要执行线性代数运算,如何你表示数据的数值会影响线性代数。出于这个原因,如何进行这种转换的决定通常是分析人员而不是库的责任。

对于本示例中的数据类型,您需要明确决定如何以数字方式表示 scikit-learn

例如,对于 categorical dtype,您可以使用 pandas get_dummies 函数进行 one-hot 编码。这将为原始列中的每个可能值创建一个新列,如果该列是该值,则为 1,如果不是,则为 0

In [2]: import pandas as pd

In [3]: s = pd.Series(['a', 'b', 'c', 'a'], dtype='category')

In [4]: s
Out[4]:
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a, b, c]

In [5]: pd.get_dummies(s)
Out[5]:
   a  b  c
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0

在您的示例中可能如下所示:

a = a.drop('Hours', axis=1).join(pd.get_dummies(a.Hours))

但是,在这种情况下,我希望小时更自然地表示为浮点数或整数。所以,你可以这样做:

a.Hours = a.Hours.astype(float)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多