当自变量和目标变量都是分类变量时的特征选择

我展示了一个我正在处理的数据集的小样本。我的原始数据集有大约400列的’症状’和1列的’疾病’。从这里开始,预期的输出是找出对特定疾病最重要的前'N'个症状,可能10个或其他数量的症状。我的样本数据集如下所示:

fever    headche     sore throat          drowsiness               Disease    0        0         1                   0                      Fungal infection    0        0         0                   1                      Fungal infection    0        1         0                   0                      liver infection    1        0         0                   1                      diarrhoea    0        0         1                   1                      common cold    0        1         1                   0                      diarrhoea    1        0         0                   0                      flu    

我尝试使用sklearn的SelectKBest,但无法理解结果。我还想知道pandas的数据框.corr函数是否在这种情况下可以使用


回答:

解决这个问题的其中一种方法是使用特征概率建模为伯努利分布的朴素贝叶斯分类器。这假设目标变量不是您在问题中提到的分类变量,而只是二元变量。我认为这是一个更合理的假设,并且似乎从您的输入数据的构造来看,输入变量似乎是二元的。

第一次模型运行可以是如下所示(调整来自这个答案important_features函数):

import numpy as npimport pandas as pdfrom sklearn.naive_bayes import BernoulliNBdef important_features(classifier,feature_names, n=20):    class_labels = classifier.classes_    for i,feature in enumerate(feature_names):         print("Important features in ", class_labels[i])        topn_class = sorted(zip(classifier.feature_log_prob_[i], feature_names),                            reverse=True)[:n]                for coef, feat in topn_class:            print(coef, feat)        print('-----------------------')d = {}d['fever'] = np.array([0,0,0,1,0,0,1])d['headache'] = np.array([0,0,1,0,0,1,0])d['sorethroat'] = np.array([1,0,0,0,1,1,0])d['drowsiness'] = np.array([0,1,0,1,1,0,0])d['disease'] = ['Fungal infection','Fungal infection','liver infection',           'diarrhoea','common cold','diarrhoea','flu']df = pd.DataFrame(d)X = df[df.columns[:-1]]y = df['disease']clf = BernoulliNB()clf.fit(X, y)BernoulliNB()important_features(clf,df.columns[:-1])

这应该会给您以下输出,当然这仅用于演示目的,因为我仅使用了您上面提供的数据:

Important features in  Fungal infection-0.6931471805599453 sorethroat-0.6931471805599453 drowsiness-1.3862943611198906 headache-1.3862943611198906 fever-----------------------Important features in  common cold-0.4054651081081645 sorethroat-0.4054651081081645 drowsiness-1.0986122886681098 headache-1.0986122886681098 fever-----------------------Important features in  diarrhoea-0.6931471805599453 sorethroat-0.6931471805599453 headache-0.6931471805599453 fever-0.6931471805599453 drowsiness-----------------------Important features in  flu-0.4054651081081645 fever-1.0986122886681098 sorethroat-1.0986122886681098 headache-1.0986122886681098 drowsiness-----------------------

当然,朴素贝叶斯不会考虑自变量之间的相关性,例如,如果一个人有发烧,那么他们更可能有头痛,并且与潜在的疾病无关。如果这个限制对您来说不是问题,那么您可以继续为所有数据运行模型。请注意,训练一个估计数据中所有可能相关性的更通用的模型可能是非常非常困难的。

最后,请注意pandas的corr方法会给您自变量的相关性,但它与从输入预测疾病的模型无关。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注