python - 分类器中是否正确选择和使用了所有特征?
问题描述
我想知道当我使用分类器时,例如:
random_forest_bow = Pipeline([
('rf_tfidf',Feat_Selection. countV),
('rf_clf',RandomForestClassifier(n_estimators=300,n_jobs=3))
])
random_forest_ngram.fit(DataPrep.train['Text'],DataPrep.train['Label'])
predicted_rf_ngram = random_forest_ngram.predict(DataPrep.test_news['Text'])
np.mean(predicted_rf_ngram == DataPrep.test_news['Label'])
我也在考虑模型中的其他特征。我将 X 和 y 定义如下:
X=df[['Text','is_it_capital?', 'is_it_upper?', 'contains_num?']]
y=df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=40)
df_train= pd.concat([X_train, y_train], axis=1)
df_test = pd.concat([X_test, y_test], axis=1)
countV = CountVectorizer()
train_count = countV.fit_transform(df.train['Text'].values)
我的数据集如下所示
Text is_it_capital? is_it_upper? contains_num? Label
an example of text 0 0 0 0
ANOTHER example of text 1 1 0 1
What's happening?Let's talk at 5 1 0 1 1
is_it_capital?
我也想将, is_it_upper?
,用作特征contains_num?
,但由于它们具有二进制值(编码后为 1 或 0),我应该仅在 Text 上应用 BoW 以提取额外特征。也许我的问题很明显,但由于我是一个新的 ML 学习者并且我不熟悉分类器和编码,我将感谢您提供的所有支持和评论。谢谢
解决方案
您当然可以使用您的“额外”功能,如is_it_capital?
、is_it_upper?
和contains_num?
. 您似乎正在为如何准确地组合这两个看似完全不同的功能集而苦苦挣扎。您可以使用sklearn.pipeline.FeatureUnion或sklearn.compose.ColumnTransformer 之类的东西将不同的编码策略应用于每组功能。没有理由不能将额外的特征与任何文本特征提取方法(例如,您的 BoW 方法)结合使用。
df = pd.DataFrame({'text': ['this is some text', 'this is some MORE text', 'hi hi some text 123', 'bananas oranges'], 'is_it_upper': [0, 1, 0, 0], 'contains_num': [0, 0, 1, 0]})
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.compose import ColumnTransformer
transformer = ColumnTransformer([('text', CountVectorizer(), 'text')], remainder='passthrough')
X = transformer.fit_transform(df)
print(X)
[[0 0 0 1 0 0 1 1 1 0 0]
[0 0 0 1 1 0 1 1 1 1 0]
[1 0 2 0 0 0 1 1 0 0 1]
[0 1 0 0 0 1 0 0 0 0 0]]
print(transformer.get_feature_names())
['text__123', 'text__bananas', 'text__hi', 'text__is', 'text__more', 'text__oranges', 'text__some', 'text__text', 'text__this', 'is_it_upper', 'contains_num']
更多关于你的具体例子:
X=df[['Text','is_it_capital?', 'is_it_upper?', 'contains_num?']]
y=df['Label']
# Need to use DenseTransformer to properly concatenate results
# from CountVectorizer and other transformer steps
from sklearn.base import TransformerMixin
class DenseTransformer(TransformerMixin):
def fit(self, X, y=None, **fit_params):
return self
def transform(self, X, y=None, **fit_params):
return X.todense()
from sklearn.pipeline import Pipeline
pipeline = Pipeline([
('vectorizer', CountVectorizer()),
('to_dense', DenseTransformer()),
])
transformer = ColumnTransformer([('text', pipeline, 'Text')], remainder='passthrough')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=40)
X_train = transformer.fit_transform(X_train)
X_test = transformer.transform(X_test)
df_train = pd.concat([X_train, y_train], axis=1)
df_test = pd.concat([X_test, y_test], axis=1)
推荐阅读
- sql - Redshift - 窗口函数 - 获取每行前一小时的统计信息
- typescript - 正确使用 FormData 的方法
- angular - 冻结列和可滚动列数据与primeng表不一致
- xml - 在 .Net Core 中使用 X509Certificate 签署 SOAP 调用
- laravel - 使用中间件将每个请求作为普通 json Laravel 返回
- react-native - React-Native-Web 配置问题:找不到模块:错误:无法解析“react-native-screens”
- jvm - Java JUnit JVM_EnqueueOperation() 存根
- jenkins - 您的反向代理设置似乎已损坏 - Jenkins IIS
- python - 错误 - 用户名或密码不正确 - 与雪花的胶水连接
- selenium - document.getElementsByClassName() 的 Selenium xpath 问题