如何使用KBinsDiscretizer在Sklearn中将连续数据制作为垃圾箱?

Mas*_*s17 5 numpy machine-learning python-3.x scikit-learn sklearn-pandas

我正在研究一种ML算法,在该算法中,我试图将连续目标值转换为较小的bin,以更好地理解问题。因此可以做出更好的预测。我最初的问题是回归,但是我通过制作带有标签的小垃圾箱将其转换为分类。

我做了如下

from sklearn.preprocessing import KBinsDiscretizer  
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
s = est.fit(target) 
Xt = est.transform(s)
Run Code Online (Sandbox Code Playgroud)

它显示一个值错误,如下所示。然后,我将数据重塑为2D。但我无法解决。

ValueError:预期的2D数组,而是1D数组:

from sklearn.preprocessing import KBinsDiscretizer

myData = pd.read_csv("train.csv", delimiter=",")
target = myData.iloc[:,-5]  # this is a continuous data which must be 
                        # converted into bins with a new column.

xx = target.values.reshape(21263,1)

est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
s = est.fit(xx) 
Xt = est.transform(s)
Run Code Online (Sandbox Code Playgroud)

您可以看到我的目标有21263行。我必须将它们分成10个相等的bin,并将其写入数据框的新列中。感谢您的指导。

PS:最高目标值:185.0
最低目标值:0.00021

Mas*_*s17 7

好的,我能够解决它。无论如何,如果将来有人需要这个答案,我会发布答案。我用了pandas.qcut

target['Temp_class'] = pd.qcut(target['Temeratue'], 10, labels=False)
Run Code Online (Sandbox Code Playgroud)

这已经解决了我的问题。


Dou*_*oug 6

我在处理泰坦尼克号数据集时遇到了类似的问题。我发现我的一个函数已将我的列转换为浮点数,并且通过将其更改为整数,这似乎有助于解决问题。另外,用双方括号调用特定的列名称对我有用:

from sklearn.preprocessing import KBinsDiscretizer
est = KBinsDiscretizer(n_bins=5, encode='onehot-dense', strategy='uniform')
new = est.fit_transform(dataset[['column_name']])
Run Code Online (Sandbox Code Playgroud)


Ven*_*lam 5

您第一次尝试的错误是您将 fit 函数的输出转换为转换。.fit()返回拟合模型而不是输入数据。正确的方法是以下之一。

from sklearn.preprocessing import KBinsDiscretizer  
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
Xt = est.fit_transform(target) 
Run Code Online (Sandbox Code Playgroud)

或者

from sklearn.preprocessing import KBinsDiscretizer  
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit(target)
Xt = est.transform(target)
Run Code Online (Sandbox Code Playgroud)