首页 > 解决方案 > sklearn:垃圾箱必须单调递增或递减

问题描述

我有一个 Python 列表,其中包含连续值(从 0 到 1020),我想使用 K-Means 策略以 0 到 5 的序数值对其进行描述。

我已经使用新类sklearn.preprocessing.KBinsDiscretizer来执行此操作:

def descritise_kmeans(python_arr, num_bins):
    X = np.array(python_arr).reshape(-1, 1) 
    est = KBinsDiscretizer(n_bins=num_bins, encode='ordinal', strategy='kmeans')
    est.fit(X)  
    Xt = est.transform(X)
    return Xt

运行此方法时,出现错误:

/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/preprocessing/_discretization.py in transform(self, X)
    262             atol = 1.e-8
    263             eps = atol + rtol * np.abs(Xt[:, jj])
--> 264             Xt[:, jj] = np.digitize(Xt[:, jj] + eps, bin_edges[jj][1:])
    265         np.clip(Xt, 0, self.n_bins_ - 1, out=Xt)
    266 

ValueError: bins must be monotonically increasing or decreasing

仔细观察时,似乎numpy.descritize方法是引发错误的方法。这似乎是 Sklearn 库的错误。

当 bin 数量n_bins为 6 时,将引发错误。但是,当n_bins 为 5 时,它可以工作。

标签: pythonscikit-learn

解决方案


我遇到了类似的问题,我发现我在为垃圾箱设置值时犯了错误。我的代码很简单

bins = np.array([0.0, .33, 66, 1])
data = [0.1, .2, .4, .5, .7, 8]
inds = np.digitize(data, bins, right=False)

我在 0.66 之前错过了一个点,而且我的垃圾箱不是单调的。虽然它可能不是这个问题的问题根源,但我希望它对某人有所帮助。


推荐阅读