将数字特征转换为分类特征
Converting numeric feature into categorical feature
我正在研究根据历史数据预测未来电子商店销售额的问题。我使用的功能之一是 商品价格(浮动)。我通过实验发现,将此添加到现有功能列表会降低我的 xgboost
模型的拟合和验证准确性(增加预测 RMSE)。我怀疑价格的影响可能是高度非线性的,记忆棒、笔记本电脑、手机等的价格达到峰值
无论如何,我有以下想法来解决这个问题:如果我将浮点数 item price 转换为具有指定映射能力的分类变量,例如,数值范围或十分位数?然后,我可以使用训练目标值 mean-encode 该分类变量 item price.
这有意义吗?你能给我一个指向 Python "linear/decile histogrammer" 的指针吗 returns,对于浮点数列表,return 一个平行列表,其中 bin/decile 每个浮点数属于?
恕我直言,您可以使用 qcut
, KBinsDiscretizer
or cut
。
一些例子,
>>> df = pd.DataFrame(np.random.randn(10), columns=['a'])
>>> df
a
0 0.060278
1 -0.618677
2 -0.472467
3 1.539958
4 -0.181974
5 1.563588
6 -1.693140
7 1.868881
8 1.072179
9 0.575978
对于qcut
,
>>> df['cluster'] = pd.qcut(df.a, 5, labels=range(1, 6))
>>> df
a cluster
0 0.060278 3
1 -0.618677 1
2 -0.472467 2
3 1.539958 4
4 -0.181974 2
5 1.563588 5
6 -1.693140 1
7 1.868881 5
8 1.072179 4
9 0.575978 3
对于KBinsDiscretizer
,
>>> (df['cluster'] =
KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='quantile')
.fit_transform(df.a.values.reshape(-1, 1)))
>>> df
a cluster
0 0.060278 1.0
1 -0.618677 0.0
2 -0.472467 0.0
3 1.539958 2.0
4 -0.181974 1.0
5 1.563588 2.0
6 -1.693140 0.0
7 1.868881 2.0
8 1.072179 2.0
9 0.575978 1.0
对于cut
,
>>> df['cluster'] = pd.cut(df.a, 5, labels=range(1, 6))
>>> df
a cluster
0 0.060278 3
1 -0.618677 2
2 -0.472467 2
3 1.539958 5
4 -0.181974 3
5 1.563588 5
6 -1.693140 1
7 1.868881 5
8 1.072179 4
9 0.575978 4
最后,看看可能有用:
我正在研究根据历史数据预测未来电子商店销售额的问题。我使用的功能之一是 商品价格(浮动)。我通过实验发现,将此添加到现有功能列表会降低我的 xgboost
模型的拟合和验证准确性(增加预测 RMSE)。我怀疑价格的影响可能是高度非线性的,记忆棒、笔记本电脑、手机等的价格达到峰值
无论如何,我有以下想法来解决这个问题:如果我将浮点数 item price 转换为具有指定映射能力的分类变量,例如,数值范围或十分位数?然后,我可以使用训练目标值 mean-encode 该分类变量 item price.
这有意义吗?你能给我一个指向 Python "linear/decile histogrammer" 的指针吗 returns,对于浮点数列表,return 一个平行列表,其中 bin/decile 每个浮点数属于?
恕我直言,您可以使用 qcut
, KBinsDiscretizer
or cut
。
一些例子,
>>> df = pd.DataFrame(np.random.randn(10), columns=['a'])
>>> df
a
0 0.060278
1 -0.618677
2 -0.472467
3 1.539958
4 -0.181974
5 1.563588
6 -1.693140
7 1.868881
8 1.072179
9 0.575978
对于qcut
,
>>> df['cluster'] = pd.qcut(df.a, 5, labels=range(1, 6))
>>> df
a cluster
0 0.060278 3
1 -0.618677 1
2 -0.472467 2
3 1.539958 4
4 -0.181974 2
5 1.563588 5
6 -1.693140 1
7 1.868881 5
8 1.072179 4
9 0.575978 3
对于KBinsDiscretizer
,
>>> (df['cluster'] =
KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='quantile')
.fit_transform(df.a.values.reshape(-1, 1)))
>>> df
a cluster
0 0.060278 1.0
1 -0.618677 0.0
2 -0.472467 0.0
3 1.539958 2.0
4 -0.181974 1.0
5 1.563588 2.0
6 -1.693140 0.0
7 1.868881 2.0
8 1.072179 2.0
9 0.575978 1.0
对于cut
,
>>> df['cluster'] = pd.cut(df.a, 5, labels=range(1, 6))
>>> df
a cluster
0 0.060278 3
1 -0.618677 2
2 -0.472467 2
3 1.539958 5
4 -0.181974 3
5 1.563588 5
6 -1.693140 1
7 1.868881 5
8 1.072179 4
9 0.575978 4
最后,看看可能有用: