Как использовать KBinsDiscretizer для преобразования непрерывных данных в корзины в Sklearn? - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над алгоритмом ML, в котором я пытался преобразовать непрерывные целевые значения в небольшие ячейки, чтобы лучше понять проблему.Следовательно, чтобы сделать лучший прогноз.Моя оригинальная проблема - для регрессии, но я перехожу в классификацию, делая маленькие корзины с метками.

Я сделал следующим образом,

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

Это показывает ошибку значения, как показано ниже.Затем я изменил свои данные в 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)

Вы видите, что у моей цели 21263 строки.Я должен разделить их на 10 одинаковых корзин и записать их в новый столбец в моем фрейме данных.Спасибо за руководство.

PS: максимальное целевое значение: 185,0
минимальное целевое значение: 0,00021

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Ошибка в вашей первой попытке состоит в том, что вы передаете вывод функции подгонки в преобразование..fit() возвращает установленную модель, а не входные данные.Правильный путь будет одним из следующих.

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

или

from sklearn.preprocessing import KBinsDiscretizer  
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit(target)
Xt = est.transform(target)
0 голосов
/ 29 января 2019

У меня была похожая проблема при работе с набором данных Титаник.Я обнаружил, что одна из моих функций преобразовала мой столбец в число с плавающей точкой, и, изменив его на целое, это, похоже, помогло решить проблему.Кроме того, для меня сработал вызов имени конкретного столбца в двойных квадратных скобках:

from sklearn.preprocessing import KBinsDiscretizer
est = KBinsDiscretizer(n_bins=5, encode='onehot-dense', strategy='uniform')
new = est.fit_transform(dataset[['column_name']])
0 голосов
/ 28 декабря 2018

Хорошо, я смог решить это.В любом случае я отправлю ответ, если кому-то еще понадобится это в будущем.Я использовал pandas.qcut

target['Temp_class'] = pd.qcut(target['Temeratue'], 10, labels=False)

Это решило мою проблему.

...