如何使用 MinMaxScaler() 将规范化应用于所有列,但排除分类?
How to apply Normalisation using the MinMaxScaler() to all Columns, but Exclude the Categorical?
我刚开始使用 MinMaxScaler
,所以如果这是一个非常非常简单的问题,请不要咬我的脑袋。下面,我有以下数据集:
sample_df.head(2)
ID S_LENGTH S_WIDTH P_LENGTH P_WIDTH SPECIES
-------------------------------------------------------------------
1 3.5 2.5 5.6 1.7 VIRGINICA
2 4.5 5.6 3.4 8.7 SETOSA
因此,如何使用下面的代码对我的所有列(不包括 ID
和 SPECIES
列)将规范化应用于此数据集?
我基本上想使用 preprocessing.MinMaxScaler()
应用归一化,以便所有特征都在 0 和 1 的范围内。
这是我正在使用的代码...
min_max = preprocessing.MinMaxScaler()
min_max.fit_transform(sample_df)
...但是当我执行它时,我得到这个错误:
ValueError: could not convert string to float: 'SETOSA'
非常感谢任何有关如何完成我想做的事情的帮助!
此外,如果这是一个非常愚蠢的问题,我深表歉意,但我是新手。
谢谢!
编辑(显示错误):
或者,如果我这样做...
min_max = preprocessing.MinMaxScaler()
min_max.fit_transform(sample_df[['S_LENGTH', 'S_WIDTH']])
sample_df.head(2)
...我收到此错误:
AttributeError: 'numpy.ndarray' object has no attribute 'sample'
我怀疑这是否会有帮助,但是您可以通过以下方式获得 numeric
列:
num_df = df[[i for i in df.columns if df[i].dtypes != 'O']]
num_df
Out[126]:
ID S_LENGTH S_WIDTH P_LENGTH P_WIDTH
0 1 3.5 2.5 5.6 1.7
1 2 4.5 5.6 3.4 8.7
然后在上面应用 MinMaxScaler
:
min_max = preprocessing.MinMaxScaler()
min_max.fit_transform(num_df)
Out[129]:
array([[0., 0., 0., 1., 0.],
[1., 1., 1., 0., 1.]])
编辑:
使用你的 df
:
df
Out[162]:
ID S_LENGTH S_WIDTH P_LENGTH P_WIDTH SPECIES
0 1 3.5 2.5 5.6 1.7 VIRGINICA
1 2 4.5 5.6 3.4 8.7 SETOSA
使用以下代码:
num_df = min_max.fit_transform(pd.DataFrame((df[[i for i in df.columns if df[i].dtypes != 'O']])))
num_df.columns = [i for i in df.columns if df[i].dtypes != 'O']
cat_df = (df[[i for i in df.columns if df[i].dtypes == 'O']])
res = pd.merge(num_df,cat_df,left_index=True,right_index=True)
这会给你:
print(res)
ID S_LENGTH S_WIDTH P_LENGTH P_WIDTH SPECIES
0 0.0 0.0 0.0 1.0 0.0 VIRGINICA
1 1.0 1.0 1.0 0.0 1.0 SETOSA
逐行尝试代码,如果这是您需要的,请告诉我。
我刚开始使用 MinMaxScaler
,所以如果这是一个非常非常简单的问题,请不要咬我的脑袋。下面,我有以下数据集:
sample_df.head(2)
ID S_LENGTH S_WIDTH P_LENGTH P_WIDTH SPECIES
-------------------------------------------------------------------
1 3.5 2.5 5.6 1.7 VIRGINICA
2 4.5 5.6 3.4 8.7 SETOSA
因此,如何使用下面的代码对我的所有列(不包括 ID
和 SPECIES
列)将规范化应用于此数据集?
我基本上想使用 preprocessing.MinMaxScaler()
应用归一化,以便所有特征都在 0 和 1 的范围内。
这是我正在使用的代码...
min_max = preprocessing.MinMaxScaler()
min_max.fit_transform(sample_df)
...但是当我执行它时,我得到这个错误:
ValueError: could not convert string to float: 'SETOSA'
非常感谢任何有关如何完成我想做的事情的帮助!
此外,如果这是一个非常愚蠢的问题,我深表歉意,但我是新手。
谢谢!
编辑(显示错误):
或者,如果我这样做...
min_max = preprocessing.MinMaxScaler()
min_max.fit_transform(sample_df[['S_LENGTH', 'S_WIDTH']])
sample_df.head(2)
...我收到此错误:
AttributeError: 'numpy.ndarray' object has no attribute 'sample'
我怀疑这是否会有帮助,但是您可以通过以下方式获得 numeric
列:
num_df = df[[i for i in df.columns if df[i].dtypes != 'O']]
num_df
Out[126]:
ID S_LENGTH S_WIDTH P_LENGTH P_WIDTH
0 1 3.5 2.5 5.6 1.7
1 2 4.5 5.6 3.4 8.7
然后在上面应用 MinMaxScaler
:
min_max = preprocessing.MinMaxScaler()
min_max.fit_transform(num_df)
Out[129]:
array([[0., 0., 0., 1., 0.],
[1., 1., 1., 0., 1.]])
编辑:
使用你的 df
:
df
Out[162]:
ID S_LENGTH S_WIDTH P_LENGTH P_WIDTH SPECIES
0 1 3.5 2.5 5.6 1.7 VIRGINICA
1 2 4.5 5.6 3.4 8.7 SETOSA
使用以下代码:
num_df = min_max.fit_transform(pd.DataFrame((df[[i for i in df.columns if df[i].dtypes != 'O']])))
num_df.columns = [i for i in df.columns if df[i].dtypes != 'O']
cat_df = (df[[i for i in df.columns if df[i].dtypes == 'O']])
res = pd.merge(num_df,cat_df,left_index=True,right_index=True)
这会给你:
print(res)
ID S_LENGTH S_WIDTH P_LENGTH P_WIDTH SPECIES
0 0.0 0.0 0.0 1.0 0.0 VIRGINICA
1 1.0 1.0 1.0 0.0 1.0 SETOSA
逐行尝试代码,如果这是您需要的,请告诉我。