#python #random-forest
Вопрос:
Мне нужно использовать функции, созданные пакетом слов (ЛУК), и дополнительные функции (например, Grp и рейтинг) в модели случайного леса.
- Поскольку ЛУК представляет собой разреженную матрицу, как мне добавить дополнительные функции для создания новой разреженной матрицы? В настоящее время я преобразую разреженную матрицу в плотную и объединяю дополнительные функции для создания df (например, df 2). Есть ли способ добавить дополнительные функции в разреженную матрицу BOW?
- Если бы мы использовали разреженную матрицу в качестве X-поезда, как бы я определил элементы по важности функций? В настоящее время я использую столбец df2.
Спасибо
from sklearn.feature_extraction.text import CountVectorizer from sklearn.ensemble import RandomForestClassifier bards_words =["The fool doth think he is wise,", "man fool"] vect = CountVectorizer() bow=vect.fit_transform(bards_words) vocab=vect.vocabulary_ new_vocab = dict([(value, key) for key, value in vocab.items()]) df0 = pd.DataFrame(bow.toarray()) df0.rename(columns=new_vocab , inplace=True) df1 = pd.DataFrame({'Grp': ['3' , '10'], 'Rating': ['1', '2'] }) df2=pd.concat([df0, df1], axis=1) X_train=df2.values forest = RandomForestClassifier(n_estimators = 500, random_state=0) forest = forest.fit(X_train, y_train) feature_importances = pd.DataFrame(forest.feature_importances_, index = df2.columns, columns=['importance']).sort_values('importance', ascending=False)
Ответ №1:
Просто используйте разреженную структуру данных. В настоящее время вы преобразуете разреженную матрицу в плотную матрицу, в кадр данных, в другой кадр данных, в плотную матрицу. Это неэффективно.
from sklearn.feature_extraction.text import CountVectorizer from sklearn.ensemble import RandomForestClassifier from scipy import sparse import numpy as np import pandas as pd bards_words =["The fool doth think he is wise,", "man fool"] df1 = pd.DataFrame({'Grp': ['3' , '10'], 'Rating': ['1', '2'] }) vect = CountVectorizer() bow=vect.fit_transform(bards_words) # Stack the two df1 columns onto the left of the sparse matrix bow = sparse.hstack((sparse.csr_matrix(df1.astype(int).values), bow)) # Keep track of features features = np.concatenate((df1.columns.values, vect.get_feature_names())) gt;gt;gt; features array(['Grp', 'Rating', 'doth', 'fool', 'he', 'is', 'man', 'the', 'think', 'wise'], dtype=object) gt;gt;gt; bow.A array([[ 3, 1, 1, 1, 1, 1, 0, 1, 1, 1], [10, 2, 0, 1, 0, 0, 1, 0, 0, 0]]) # Do your random forest forest = RandomForestClassifier(n_estimators = 500, random_state=0) forest = forest.fit(bow, y_train) feature_importances = pd.DataFrame(forest.feature_importances_, index = features, columns=['importance']).sort_values('importance', ascending=False)