在稀疏数据帧

时间:2017-06-02 22:10:26

标签: python scikit-learn sparse-matrix

我有一个带有功能列表的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来避免内存错误?

1 个答案:

答案 0 :(得分:1)

Sklean中的LogisticRegression接受稀疏矩阵(与其他许多Sklearn算法一样)。您可以在documentation中检查 fit 属性 在调用 fit 之前,尝试使用SparseDataFrame.to_coo()方法将SparseDataFrame转换为稀疏矩阵。