Как уменьшить размерность в Bag of Words для модели классификации с использованием случайного леса

Я использую Текстовые характеристики данных вместе с другими числовыми функциями для модели классификации.

Как я могу сгруппировать похожие слова вместе в контролируемой модели классификации. Как я могу сгруппировать похожие слова после подсчета, я хочу уменьшить размерность слов.

Мой код

#Cleaning the Address Data
stopwords =nltk.corpus.stopwords.words('english')
data['Clean_addr'] = data['Adj_Addr'].apply(lambda x:"".join([item for item in x if item not in stopwords]))
data['Clean_addr']=data['Clean_addr'].apply(lambda x:"".join([item for item in x if  not  item.isdigit()]))
data['Clean_addr']=data['Clean_addr'].apply(lambda x:"".join([item for item in x if item not in string.punctuation]))

#CountVectorizing the Address Data and fitting the sparse matrix to the Dataframe

cv = CountVectorizer( max_features = 1000,analyzer='word') 
cv_addr = cv.fit_transform(data.pop('Clean_addr'))
for i, col in enumerate(cv.get_feature_names()):
    data[col] = pd.SparseSeries(cv_addr[:, i].toarray().ravel(), fill_value=0)

#LabelEncoding -Converting Catergocial to Numerical
data['Resi'] = LabelEncoder().fit_transform(data['Resi'])
data['Resi_Area'] = LabelEncoder().fit_transform(data['Resi_Area'])
data['Product'] = LabelEncoder().fit_transform(data['Product'])
data['Phone_Type'] = LabelEncoder().fit_transform(data['Phone_Type'])
data['Co_Name_FLag'] = LabelEncoder().fit_transform(data['Co_Name_FLag'])

#Classification
X_train, X_test, y_train, y_test = train_test_split(train, Y, test_size=0.3,random_state =8)
rus = RandomUnderSampler(random_state=42)
X_train_res, y_train_res = rus.fit_sample(X_train, y_train)
rf=RandomForestClassifier(n_estimators=1000,oob_score=True)

fit_rf=rf.fit(X_train_res,y_train_res)

Любая помощь приветствуется.

1 ответ

Если вы хотите уменьшить размер вашей сумки слов, вы можете использовать SelectPercentile от склеарн. Вот пример данных Iris:

from sklearn.feature_selection import SelectPercentile
from sklearn.feature_selection import chi2
import numpy
iris = load_iris()
X, y = iris.data, iris.target
selector = SelectPercentile(score_func=chi2, percentile=50)
X_reduced = selector.fit_transform(X, y)

Вы можете легко расширить его до пакета слов в вашем примере:

cv = CountVectorizer( max_features = 1000,analyzer='word') 
cv_addr = cv.fit_transform(data.pop('Clean_addr'))
selector = SelectPercentile(score_func=chi2, percentile=50)
X_reduced = selector.fit_transform(cv_addr, Y)

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

Удачи.

Другие вопросы по тегам