拟合 PCA 时无法理解数据类型

Data type not understood when fitting PCA

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

TypeError: data type not understood

这是我的代码:

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

一般来说,scikit-learn 设计用于处理数字数据类型(整数和浮点数)。通常在 pandas 中,您会有 category、对象 (dtype('O'))、datetime64timedelta64 或其他 non-numeric 类型。 Pandas 专为分析而设计,"do the right thing" 也将用于这些类型。 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)