Sklearn Decision Tree - использование разреженной матрицы и других функций одновременно - PullRequest
0 голосов
/ 10 декабря 2018

Я использую дерево решений Sklearn для некоторой классификации, и у меня есть два типа данных: категориальные и непрерывные.Я использовал pd.get_dummies для своих категориальных значений и получил более 90 функций.Что, конечно, довольно много.
Дело в том, что я затем перебираю параметр max_features, чтобы получить лучший результат для моей модели, а наличие более 20 функций - это слишком много времени.Поэтому я подумал, что Sklearn может использовать разреженные матрицы для моих категориальных функций вместо 70 столбцов с 0 и 1.

Вопрос: может ли Sklearn использовать сочетание разреженных матриц и регулярных массивов или нет?Если да - как мне это сделать?В настоящее время я получаю сообщение об ошибке: setting an array element with a sequence

Вот некоторый код, чтобы получить идею.df_with_dummies - это то, что я сейчас использую, но я надеюсь, что есть способ использовать df_with_sparse

import numpy as np
import pandas as pd 
from scipy.sparse import csr_matrix

a = np.random.randn(10,3)
b = np.random.random((10,1))
df = pd.DataFrame(a, columns = "A B C".split())
df['temp'] = b
df['dum1'] = np.where(df.temp < 0.5, 1, 0)
df['dum2'] = np.where(df.temp >= 0.5, 1, 0)
del df['temp']
df_with_dummies = df.copy()

a = df[['dum1', 'dum2']]
dums = csr_matrix(a)
df['dums'] = dums
df_with_sparse = df.copy()

1 Ответ

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

Когда вы делаете:

df['dums'] = dums

dums, будучи разреженной матрицей, неправильно обрабатывается пандой DataFrame, и она будет транслироваться в каждую строку.pandas не жалуется на это, потому что рассматривает разреженную матрицу как объект, не являющийся массивом.

Это означает, что каждый элемент в столбце df['dums'] будет указывать на всю разреженную матрицу dums.По сути, каждый элемент массива устанавливается с массивом, поэтому возникает ошибка setting an array element with a sequence при обработке в оценках scikit-learn.

Для этого вы можете сделать:

from scipy.sparse import hstack
df_with_sparse = hstack([df[['A', 'B', 'C']].values, dums])

Теперь вы можете передать это дальше.

...