我有一个带有功能列表的pandas数据帧,其中一个是字符串。我正在尝试使用任何sklearn分类器。我知道在sklearn中,甚至DecisionTrees实现都不允许字符串,所以我使用One Hot Encoding。 我创建了一个函数,其中df是数据框,而feature是分类特征:
def OneHotEncoding(df, cat_feature):
dv = DictVectorizer()
dictionary = pandas.DataFrame(series[cat_feature]).to_dict(orient='records')
X = dv.fit_transform(dictionary)
columns = []
for i in range(X.shape[1]):
columns.append(str(i))
series = series.reset_index()
Y = pandas.SparseDataFrame(X, columns=columns)
new_df= pandas.DataFrame.join(df, Y, how='outer')
return new_df
然后我使用new_df将它传递给我的分类器:
alg = LogisticRegression(random_state=1))
alg.fit(new_df, labels)
但在我的.fit函数中我收到错误:
File "xxx.py", line 442
alg.fit(X, train_labels_input)
File "C:\Applications\Anaconda3\lib\site-packages\sklearn\tree\tree.py", line 739, in fit
X_idx_sorted=X_idx_sorted)
File "C:\Applications\Anaconda3\lib\site-packages\sklearn\tree\tree.py", line 122, in fit
X = check_array(X, dtype=DTYPE, accept_sparse="csc")
File "C:\Applications\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 407, in check_array
_assert_all_finite(array)
File "C:\Applications\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 58, in _assert_all_finite
" or a value too large for %r." % X.dtype)
ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
如果我不使用SparseDataFrame,我会这样做:
Y = pandas.DataFrame(X.todense(), columns=columns)
它有效。
如何使用SparseDataFrame来避免内存错误?
答案 0 :(得分:1)
Sklean中的LogisticRegression接受稀疏矩阵(与其他许多Sklearn算法一样)。您可以在documentation中检查 fit 属性 在调用 fit 之前,尝试使用SparseDataFrame.to_coo()方法将SparseDataFrame转换为稀疏矩阵。