【问题标题】:How to do dimension reduction in Bag of Words for a Classification Model using Random Forest如何使用随机森林对分类模型的词袋进行降维
【发布时间】:2018-05-18 18:37:47
【问题描述】:

我将文本数据特征与其他数字特征一起用于分类模型。

如何在监督分类模型中将相似的词袋分组。计数向量化后如何对相似词进行分组,我想减少词袋的维度。

我的代码

#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)

感谢任何帮助。

【问题讨论】:

  • 您需要定义相似词的含义的策略。你的意思是它们的长度应该相同还是你的意思是缩写应该被认为与完整形式相同等。这本身就是一个非常广泛的问题,正在积极研究中。也许 word2vec 可以提供帮助。 word2vec 将为相似的单词提供相似或近距离的数组值。
  • 或者你可以创建一个相似词的字典,并将文本中所有出现的其他词替换为它们的代表词,然后调用 TfidfVectorizer。但不建议这样做。
  • @VivekKumar,我正在查看缩写词,并同时匹配 limited & ltd
  • 是的,我就是这么说的。它不是那么简单和直接。您需要一个可以在文本中替换的所有此类缩写的集合。

标签: pandas scikit-learn nltk random-forest supervised-learning


【解决方案1】:

如果你想减少你的词袋尺寸,你可以使用 sklearn 的SelectPercentile。这是一个关于虹膜数据的例子:

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)

之后,您可以进行不同的试验以查看哪个百分位数效果最好,并最终按百分位数绘制分数,还可以绘制得分高的单词及其相关的词频,以下是此类条形图的示例:

祝你好运。

【讨论】:

  • 这可以处理将相似的词组合在像 Limited & Ltd 这样的词袋中吗?好和好等。
  • mmh 不是真的。如果你想对相似的词进行分组,要么在文档级别使用 tfidf 权重,要么使用词嵌入。卡方选择仅根据词的分类辨别力对词进行评分。
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 2023-03-23
  • 2014-03-08
  • 2015-11-07
  • 2019-05-04
  • 2016-04-02
  • 2019-09-05
  • 2013-09-22
相关资源
最近更新 更多