拟合 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')
)、datetime64
、timedelta64
或其他 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)
我正在对数据集中的特征进行主成分分析以进行降维。但是,当我尝试使我的模型适合我的特征时,我不断遇到此错误消息:
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')
)、datetime64
、timedelta64
或其他 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)