我展示了一个我正在处理的数据集的小样本。我的原始数据集有大约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
方法会给您自变量的相关性,但它与从输入预测疾病的模型无关。