【问题标题】:Feature selection when independent variables are categorical and also target variable is categorical当自变量是分类且目标变量也是分类时的特征选择
【发布时间】:2020-10-26 01:32:14
【问题描述】:

我已经展示了我正在处理的数据集的一个小样本。我的原始数据集大约有 400 列用于“症状”,1 列用于“疾病”。从这里the output expected is to find out the top 'N' maybe 10 or some number of 'Symptoms' which are most significant for a particular disease. 我的示例数据集如下:

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,但无法理解结果。也想知道panda的dataframe.corr函数在这种情况下能不能工作

【问题讨论】:

  • 如果我明白了,您想对每种疾病的每列中的值求和,并确定每行具有最高 n 项的列吗?这是每种疾病的主要症状吗?
  • @wwnde 我没有清楚地提到这一点,我的错。我不是在寻找总和。我正在寻找的是每个症状之间的相关性。例如,如果我输入头痛,我想找出哪些其他症状最有可能与头痛一起出现。所以,给定头痛的症状,给我头痛可能出现的前“N”个症状。希望说明清楚,或者请告诉我。

标签: python pandas machine-learning scikit-learn categorical-data


【解决方案1】:

解决此问题的一种方法是使用朴素贝叶斯分类器,其特征概率建模为Bernoulli distributions。这假设目标变量不是您在问题中提到的分类变量,而只是二进制变量。我认为这是一个更合理的假设,在我看来,它来自于输入数据的构造,其中输入变量似乎是二进制的。

第一个模型传递可以是以下(从 answer 改编 important_features 函数:

import numpy as np
import pandas as pd
from sklearn.naive_bayes import BernoulliNB

def 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 方法将为您提供自变量的相关性,但它与根据输入预测疾病的模型没有任何关系。

【讨论】:

  • 感谢您的回答。我有一个巨大的数据集,我刚刚提供了一个样本。大约有 400 种症状。是否有任何优化的方法可以将它们转换为 numpy 数组,如示例 'd['fever'] = np.array([0,0,0,1,0,0,1])' 中所示。否则手动执行此操作似乎非常困难。
  • 您不应该手动操作。您如何读取数据集?如果您像数据框一样阅读它,那么您可以直接进入以 X = df[df.columns[:-1]] 开头的步骤
  • 谢谢。试过了。正在发生的事情更多的是基于计数的重要功能。因此,如果我获得前 10 名,则第一个值是唯一的,其余的都是相同的。这主要发生在整个数据集中。
猜你喜欢
  • 2021-04-27
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2021-05-06
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多