Я бы сделал это наоборот и добавил бы ваши функции в вашу векторизацию. Вот что я имею в виду с игрушечным примером:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
from scipy.sparse import hstack, csr_matrix
Предположим, теперь у вас есть функции в кадре данных с именем df
, а ваши метки в y_train
:
df = pd.DataFrame({"a":[1,2],"b":[2,3],"c":['we love cars', 'we love cakes']})
y_train = np.array([0,1])
Вы хотите выполнить векторизацию текста для столбца c
и добавить функции a
и b
к векторизации.
vectorizer = CountVectorizer()
CountVecTest = vectorizer.fit_transform(df.c)
CountVecTest.toarray()
Это вернет:
array([[0, 1, 1, 1],
[1, 0, 1, 1]], dtype=int64)
Но CountVecTest
теперь скудная разреженная матрица. Так что вам нужно добавить свои функции в эту матрицу. Как это:
X_train = hstack([CountVecTest, csr_matrix(df[['a','b']])])
X_train.toarray()
Это вернется, как и ожидалось:
array([[0, 1, 1, 1, 1, 2],
[1, 0, 1, 1, 2, 3]], dtype=int64)
Тогда вы можете тренировать свой случайный лес:
rf = RandomForestClassifier(criterion='entropy', min_samples_leaf=10, min_samples_split=20)
rf.fit(X_train, y_train)
NB. В предоставленном вами фрагменте кода вы передали информацию о метке (столбец «бот») функциям обучения, которые вы явно не должны делать.