Случайный лес: Как добавить дополнительные функции в разреженную матрицу и определить элементы, имеющие значение для функций?

#python #random-forest

Вопрос:

Мне нужно использовать функции, созданные пакетом слов (ЛУК), и дополнительные функции (например, Grp и рейтинг) в модели случайного леса.

  1. Поскольку ЛУК представляет собой разреженную матрицу, как мне добавить дополнительные функции для создания новой разреженной матрицы? В настоящее время я преобразую разреженную матрицу в плотную и объединяю дополнительные функции для создания df (например, df 2). Есть ли способ добавить дополнительные функции в разреженную матрицу BOW?
  2. Если бы мы использовали разреженную матрицу в качестве 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)