【问题标题】:How to select best features in Dataframe using the Information Gain measure in scikit-learn [closed]如何使用 scikit-learn 中的信息增益度量来选择 Dataframe 中的最佳特征 [关闭]
【发布时间】:2021-01-28 06:31:07
【问题描述】:

我想使用 Information Gain 度量(scikit-learn 中的 Mutual Info)识别 Dataframe 的 10 个最佳特征,并将它们显示在表格中(根据 Information Gain 获得的分数升序排列)。

在此示例中,features 是包含所有有趣的训练数据的 Dataframe,这些数据可以判断餐厅是否会关门。

# Initialization of data and labels
x = features.copy () # "x" contains all training data
y = x ["closed"] # "y" contains the labels of the records in "x"

# Elimination of the class column (closed) of features
x = x.drop ('closed', axis = 1)

# this is x.columns, sorry for the mix french and english
features_columns = ['moyenne_etoiles', 'ville', 'zone', 'nb_restaurants_zone',
       'zone_categories_intersection', 'ville_categories_intersection',
       'nb_restaurant_meme_annee', 'ecart_type_etoiles', 'tendance_etoiles',
       'nb_avis', 'nb_avis_favorables', 'nb_avis_defavorables',
       'ratio_avis_favorables', 'ratio_avis_defavorables',
       'nb_avis_favorables_mention', 'nb_avis_defavorables_mention',
       'nb_avis_favorables_elites', 'nb_avis_defavorables_elites',
       'nb_conseils', 'nb_conseils_compliment', 'nb_conseils_elites',
       'nb_checkin', 'moyenne_checkin', 'annual_std', 'chaine',
       'nb_heures_ouverture_semaine', 'ouvert_samedi', 'ouvert_dimanche',
       'ouvert_lundi', 'ouvert_vendredi', 'emporter', 'livraison',
       'bon_pour_groupes', 'bon_pour_enfants', 'reservation', 'prix',
       'terrasse']

# normalization
std_scale = preprocessing.StandardScaler().fit(features[features_columns])
normalized_data = std_scale.transform(features[features_columns])
labels = np.array(features['closed'])

# split the data 
train_features, test_features, train_labels, test_labels = train_test_split(normalized_data, labels, test_size = 0.2, random_state = 42)

labels_true = ?
labels_pred = ?

# I dont really know how to use this function to achieve what i want
from sklearn.feature_selection import mutual_info_classif
from sklearn.datasets import make_classification



# Get the mutual information coefficients and convert them to a data frame
coeff_df =pd.DataFrame(features,
                         columns=['Coefficient'], index=x.columns)

coeff_df.head()


使用 Mutual Info 分数实现此目的的正确语法是什么?

【问题讨论】:

  • 您尝试过什么,您的尝试出了什么问题? sklearn user guide on clusterin 有语法和使用示例
  • 在我的例子中,labels_true 和 labels_pred 是我的 train_features 和 test_features 吗?
  • 在这些示例中显示 0101 时会让人感到困惑
  • labels_true 和 labels_pred 是实际的 y 值,是模型预测的 y 值。因此,在您的情况下,labels_true 将是 test_labelslabels_pred 将是调用 model.predict(test_features) 返回的标签(当然,假设您已经先将模型拟合到输入特征和标签)
  • @G.Anderson 哦,所以我需要先训练一个模型?像决策树分类器或随机森林?我以为那部分是在后面。在我看来,这更像是:我使用信息增益度量选择数据帧的 10 个最佳特征,然后使用这些特征来训练模型。所以我很困惑

标签: python pandas dataframe scikit-learn feature-selection


【解决方案1】:

adjusted_mutual_info_score 将真实标签与分类器的标签预测进行比较。两个标签数组必须具有相同的形状 (nsamples,)。

您需要 Scikit-Learn 的 mutual_info_classif 来实现您想要实现的目标。将特征数组和相应的标签传递给mutual_info_classif,以获取每个特征与目标之间估计的互信息。

import numpy as np
import pandas as pd

from sklearn.feature_selection import mutual_info_classif
from sklearn.datasets import make_classification

# Generate a sample data frame
X, y = make_classification(n_samples=1000, n_features=4,
                           n_informative=2, n_redundant=2,
                           random_state=0, shuffle=False)
feature_columns = ['A', 'B', 'C', 'D']
features = pd.DataFrame(X, columns=feature_columns)

# Get the mutual information coefficients and convert them to a data frame
coeff_df =pd.DataFrame(mutual_info_classif(X, y).reshape(-1, 1),
                         columns=['Coefficient'], index=feature_columns)

输出

features.head(3)
Out[43]: 
          A         B         C         D
0 -1.668532 -1.299013  0.799353 -1.559985
1 -2.972883 -1.088783  1.953804 -1.891656
2 -0.596141 -1.370070 -0.105818 -1.213570

# Displaying only the top two features. Adjust the number as required.
coeff_df.sort_values(by='Coefficient', ascending=False)[:2]

Out[44]: 
   Coefficient
B     0.523911
D     0.366884

【讨论】:

  • 那么 make_classification 在这里做了什么? n_informative, random_state 做什么? X,y 是什么?如果我理解正确,X 是所有训练数据,y 是“X”中记录的标签?以及如何根据Information Gain得到的分数,将10个最好的特征按升序显示在一个表格中?
  • 它告诉我 int() 参数必须是字符串、类似字节的对象或数字,而不是 'DataFrame'
  • 我必须使用 make_classification 吗?
  • 当然不是,这只是示例。我正在修改答案,希望它会变得更加清晰。
  • 我的问题是我不知道你的 X 和 y 中有什么。我已经有一个数据框功能,我必须把它放在哪里才能有 coeff_df?我不能使用mutual_info_classif(X, y) 因为我没有你的make_classification 给出的(X, y)。
猜你喜欢
  • 2018-06-01
  • 2018-03-26
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 2013-04-29
  • 2018-02-24
  • 2016-02-12
相关资源
最近更新 更多