1、概述

遇到一个新的数据集时重要的第一步是使用特征效用指标构建排名,该指标是衡量特征与目标之间关联的函数。然后,您可以选择一小部分最有用的功能进行初始开发。

我们将使用的度量称为“互信息”。互信息很像相关性,因为它衡量两个量之间的关系。互信息的优点是它可以检测任何一种关系,而相关性只检测线性关系。

互信息是一个很好的通用指标,在功能开发开始时特别有用,因为您可能还不知道要使用哪种模型。

互信息易于使用和解释,计算效率高,理论上有根据,抗过拟合,并且能够检测任何类型的关系。

2、相互信息及其衡量标准

互信息描述了不确定性方面的关系。 两个量之间的互信息 (MI) 是衡量一个量的知识减少另一个量的不确定性的程度。 如果你知道一个特性的价值,你会对目标更有信心吗?

这是 Ames Housing 数据中的一个示例。 该图显示了房屋的外观质量与其售价之间的关系。 每个点代表一所房子。

了解房屋的外部质量可以减少其售价的不确定性。

从图中我们可以看出,知道 ExterQual 的值应该会让你对对应的 SalePrice 更加确定——ExterQual 的每个类别都倾向于将 SalePrice 集中在一定的范围内。 ExterQual 与 SalePrice 的互信息是采用 ExterQual 的四个值时 SalePrice 中不确定性的平均减少。 例如,由于 Fair 的出现频率低于典型,因此 Fair 在 MI 得分中的权重较小。

我们所说的不确定性是使用信息论中称为“熵”的量来衡量的。变量的熵大致意味着:“你需要多少是或否的问题来描述这种情况的发生 变量,平均而言。”你要问的问题越多,你对变量的不确定性就越大。相互信息是你期望特征回答多少关于目标的问题。

3、解释互信息分数

数量之间的最小可能互信息为 0.0。 当 MI 为零时,这些数量是独立的:两者都无法告诉您关于对方的任何信息。 相反,理论上 MI 没有上限。 在实践中,虽然高于 2.0 左右的值并不常见。 (互信息是一个对数量,所以它增加得很慢。)

下图将让您了解 MI 值如何对应于特征与目标的关联类型和程度。

左:随着特征和目标之间的依赖变得更紧密,互信息增加。 右图:相互信息可以捕捉到任何类型的关联(不仅仅是线性的,比如相关性。)

以下是应用互信息时要记住的一些事项:

MI 可以帮助您了解一个特征作为目标预测因子的相对潜力,并单独考虑。

在与其他功能交互时,一个功能可能会提供非常丰富的信息,但单独的信息量可能不是很大。 MI 无法检测特征之间的交互。 它是一个单变量指标。

功能的实际用途取决于您使用它的模型。 一个特征只有在它与目标的关系是你的模型可以学习的关系时才有用。 仅仅因为一个特征具有高 MI 分数并不意味着您的模型将能够使用该信息做任何事情。 您可能需要先转换特征以公开关联。

4、示例 - 1985 年的汽车

汽车数据集由 1985 年的 193 辆汽车组成。 该数据集的目标是根据汽车的 23 个特征(例如品牌、车身样式和马力)来预测汽车的价格(目标)。 在本例中,我们将对具有互信息的特征进行排名,并通过数据可视化研究结果。

Automobile Dataset | KaggleDataset consist of various characteristic of an autohttps://www.kaggle.com/toramky/automobile-dataset        下面的代码导入一些库并加载数据集。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as snsplt.style.use("seaborn-whitegrid")df = pd.read_csv("../input/fe-course-data/autos.csv")
df.head()

MI 的 scikit-learn 算法处理离散特征与连续特征不同。 根据经验,任何必须具有 float dtype 的东西都不是离散的。 通过给它们一个标签编码,可以将分类(对象或分类 dtype)视为离散的。

X = df.copy()
y = X.pop("price")# Label encoding for categoricals
for colname in X.select_dtypes("object"):X[colname], _ = X[colname].factorize()# All discrete features should now have integer dtypes (double-check this before using MI!)
discrete_features = X.dtypes == int

Scikit-learn 在其 feature_selection 模块中有两个互信息度量:一个用于实值目标(mutual_info_regression),一个用于分类目标(mutual_info_classif)。 我们的目标,价格,是真实价值的。 下一个单元计算我们的特征的 MI 分数,并将它们包装在一个数据框中。

from sklearn.feature_selection import mutual_info_regressiondef make_mi_scores(X, y, discrete_features):mi_scores = mutual_info_regression(X, y, discrete_features=discrete_features)mi_scores = pd.Series(mi_scores, name="MI Scores", index=X.columns)mi_scores = mi_scores.sort_values(ascending=False)return mi_scoresmi_scores = make_mi_scores(X, y, discrete_features)
mi_scores[::3]  # show a few features with their MI scores
curb_weight          1.486440
highway_mpg          0.950989
length               0.607955
bore                 0.489772
stroke               0.380041
drive_wheels         0.332973
compression_ratio    0.134799
fuel_type            0.048139
Name: MI Scores, dtype: float64

现在是一个条形图,可以让比较更容易:

def plot_mi_scores(scores):scores = scores.sort_values(ascending=True)width = np.arange(len(scores))ticks = list(scores.index)plt.barh(width, scores)plt.yticks(width, ticks)plt.title("Mutual Information Scores")plt.figure(dpi=100, figsize=(8, 5))
plot_mi_scores(mi_scores)

数据可视化是实用程序排名的一个很好的后续。 让我们仔细看看其中的几个。

正如我们所预料的那样,高分的curb_weight特征与目标价格有很强的关系。

sns.relplot(x="curb_weight", y="price", data=df);

Fuel_type 特征具有相当低的 MI 分数,但从图中我们可以看出,它清楚地区分了马力特征内具有不同趋势的两个价格人群。 这表明fuel_type 贡献了一种交互作用,而且可能并非不重要。 在从 MI 分数确定一个特性不重要之前,最好调查任何可能的交互影响——专业领域内的知识可以在这里提供很多指导。

sns.lmplot(x="horsepower", y="price", hue="fuel_type", data=df);

数据可视化是对特征工程工具箱的重要补充。 除了诸如互信息之类的实用指标外,此类可视化可以帮助您发现数据中的重要关系。

机器学习笔记 - 互信息Mutual Information相关推荐

  1. 特征选择方法详解Part2-卡方检验、互信息(Mutual Information)

    Content 1. 单变量分析 1.1 卡方检验 1.1.1 原理 1.1.2 使用示例 1.2 互信息(Mutual Information) 1.2.1 原理 1.2.1.1 互信息(Mutua ...

  2. 计算两个向量的互信息(Mutual Information) matlab程序

    互信息,Mutual Information,缩写为MI,用来计算两个变量X与Y是否有关系,以及关系的强弱 function [Ixy,lambda]=MutualInfo(X,Y) %% % Est ...

  3. 特征选择之互信息 Mutual Information

    %%%   dataset中的最后一列为分类类别,k为要选择的特征个数 function result=MutualInformation(dataset,k) % character_order c ...

  4. 互信息(Mutual Information)

    本文根据以下参考资料进行整理: 1.维基百科:https://zh.wikipedia.org/wiki/%E4%BA%92%E4%BF%A1%E6%81%AF 2.新浪博客:http://blog. ...

  5. 互信息(Mutual Information)的介绍

    互信息,Mutual Information,缩写为MI,表示两个变量X与Y是否有关系,以及关系的强弱. 如果 (X, Y) ~ p(x, y), X, Y 之间的互信息 I(X; Y)定义为: No ...

  6. 互信息(Mutual Information)介绍

    在概率论和信息论中,两个随机变量的互信息(Mutual Information,简称MI)或转移信息(transinformation)是变量间相互依赖性的量度.不同于相关系数,互信息并不局限于实值随 ...

  7. python计算互信息_Maximal Information Coefficient (MIC)最大互信息系数详解与实现

    MIC MIC 即:Maximal Information Coefficient 最大互信息系数. 使用MIC来衡量两个基因之间的关联程度,线性或非线性关系,相较于Mutual Informatio ...

  8. 机器学习笔记十:各种熵总结

    一.什么是熵 Ⅰ.信息量 首先考虑一个离散的随机变量x,当我们观察到这个变量的一个具体值的时候,我们接收到多少信息呢? 我们暂时把信息看做在学习x的值时候的"惊讶程度"(这样非常便 ...

  9. 机器学习笔记4-sklearn决策树(上)

    决策树两大核心 如何划分数据集:何时停止划分数据集 一.决策树构造 特征选择,决策树生成,决策树修剪 决策树简介 决策树由结点(node)和有向边(directed edged)组成.结点有两种类型: ...

最新文章

  1. intellij idea 常见遇到的问题整理
  2. php进销存 手机版_酒水批发用传统本地化部署进销存与云进销存手机版的区别!...
  3. HC3i论坛电子病历系统热门资源30个
  4. [ZJOI2008]泡泡堂(田忌赛马贪心)
  5. binaryviewer java_用java实现java的2进制文件字节序转换到C/C++的2进制文件字节序
  6. php链接数据库实行增删查改_最方便最简单的php操作mysql的增删改查方法
  7. 苹果高管谈论iPhone 12影像功能:硬件和软件的整体结合
  8. linux下无线网卡安装debian,Debian/Linux下无线网卡驱动的安装,网卡型号是「BCM43228」...
  9. 太赫兹芯片是什么原理_太赫兹微芯片速度可提升100倍 却遭遇研发两大挑战
  10. 多线程同步执行,CountDownLatch使用
  11. bootstrap项目中无间距栅格(grid) no-gutter
  12. 中国人工智能人才培养白皮书
  13. git代码上传详细步骤(初学者操作)
  14. 1小时学会不打代码制作一个网页精美简历(1)
  15. Netty详解第二课 Netty进阶和优化
  16. uni-app 地图拖拽后,回到我的位置
  17. BMZCTF:insomniteaser_2019_l33t_hoster
  18. Java项目开发如何设计整体架构
  19. Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: “/zhu“
  20. 14、Java——迷你图书管理器(对象+数组)

热门文章

  1. AFL++: Combining Incremental Steps of Fuzzing Research
  2. DAO 中独特的通证经济
  3. Java14它真的来了, 真是尾气都吃不到了
  4. 9.4 网易互娱客户端笔试
  5. Djange构建招聘信息爬虫系统
  6. tkinter电子木鱼
  7. 八股文(Java基础部分)
  8. 补边不失真的resize(2)
  9. 济南技校计算机专业学什么,技校计算机专业学什么-邹城
  10. 怎么样在应用中实现自助报表功能