【问题标题】:How to use Sparse Vector Feature with Numerical Feature correctly in pandas to train sklearn model?如何在 pandas 中正确使用具有数值特征的稀疏向量特征来训练 sklearn 模型?
【发布时间】:2021-08-17 11:35:33
【问题描述】:

我创建了词袋特征

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(ngram_range=(1,5))
all_corpus = X_train["excerpt"].append(X_val["excerpt"]).append(df_test["excerpt"])
vectorizer.fit(all_corpus)
bag_of_word_feature = vectorizer.transform(X_train["excerpt"])
X_train["count_bag_of_word_feature"] = bag_of_word_feature 

我还创建了数字特征(每个特征都是一个数字)

X_train["avg_sent_length"] = X_train["sent_tokenize"].apply(calculate_avg_sentences_length)
X_val["avg_sent_length"] = X_val["sent_tokenize"].apply(calculate_avg_sentences_length)

这是我的数据框。

当我尝试拟合模型时它不起作用:

regressor = KNeighborsRegressor(10, weights='distance')
regressor.fit(X_train_feature, y_train.to_numpy())

如果我使用任何一个数字特征,它都会起作用

regressor1.fit(X_train_feature[["avg_word_length", "avg_sent_length"]], y_train.to_numpy())

或词袋特征

regressor2.fit(bag_of_word_feature , y_train.to_numpy())

如何正确加入以上三个特征?

【问题讨论】:

    标签: python pandas scikit-learn sparse-matrix


    【解决方案1】:

    vectorizer.transform() 的输出是一个稀疏矩阵,您不能将其强制放入 pandas 数据框中的列中。您可以使用 bag_of_word_feature.toarray() 将其转换为密集型并将其连接到您的数据框,但如果您的数据很大,则可能不建议使用。

    下面我使用一些示例数据:

    from sklearn.datasets import fetch_20newsgroups
    from sklearn.feature_extraction.text import CountVectorizer
    import numpy as np
    import pandas as pd
    from sklearn.neighbors import KNeighborsRegressor
    from scipy.sparse import csr_matrix, hstack
    
    twenty_train = fetch_20newsgroups(subset='train',categories=['sci.med','comp.graphics'])
    
    vectorizer = CountVectorizer()
    vectorizer.fit(twenty_train.data)
    bag_of_word_feature = vectorizer.transform(twenty_train.data)
    

    假设我们在数据框中还有另外两个数字特征:

    avg_train = pd.DataFrame(np.random.randint(0,100,(len(twenty_train.data),2)),
                 columns=["avg_word_length", "avg_sent_length"])
    

    我们只需要将这些转换成稀疏的,然后hstack它们:

    X_train = hstack([csr_matrix(avg.values),bag_of_word_feature])
    y_train = twenty_train.target
    regressor = KNeighborsRegressor(10, weights='distance')
    regressor.fit(X_train, y_train)
    

    【讨论】:

    • 谢谢哥们,我会尽快回复你
    猜你喜欢
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2019-10-21
    相关资源
    最近更新 更多