特征分布与目标分析
分析特征与目标的关系、检测类别不平衡并计算互信息
特征分布与目标分析 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
为什么要分析特征与目标的关系
目标是您想要预测的变量。用于建模的 EDA 的意义在于了解哪些特征确实与该目标相关。
本课将介绍特征与目标关系图、使用互信息衡量信息量、检测类别不平衡,以及使用变换修正偏态。
特征与目标——数值目标
对于数值目标,绘制 feature 与 target 的散点图,可以显示该特征是否包含有效信号。
清晰的趋势意味着该特征具有预测能力;没有形状的点云则意味着它可能没有预测作用。
import seaborn as sns
import matplotlib.pyplot as plt
sns.scatterplot(x="rooms", y="price", data=df, alpha=0.4)
plt.show()特征与目标——分类目标
当目标是类别标签时,请在每个类别内比较特征分布。重叠的 KDE 图表示该特征难以区分类别;曲线分离良好则表示它很有用。
sns.kdeplot(data=df, x="balance", hue="churned", common_norm=False, fill=True)
plt.title("Balance by churn status")
plt.show()使用箱线图比较类别分布
分组箱线图是观察特征与类别关系的另一种方式:将目标类别放在 x 轴,将特征放在 y 轴。
不同类别的中位数不同,说明该特征有助于区分这些类别。
sns.boxplot(x="churned", y="tenure", data=df)
plt.show()检测类别不平衡
类别不平衡是指某个目标类别的数量远远超过另一个类别(例如 95% 为非欺诈,5% 为欺诈)。这会误导准确率,并使模型偏向多数类别。
您可以对目标执行简单的计数来检查这一点。
print(df["churned"].value_counts())
# 0 9200
# 1 800使用 value_counts(normalize=True) 获取比例
原始计数可能掩盖不平衡的严重程度。normalize=True 会将计数转换为比例,因此您可以直接将其读作百分比。
print(df["churned"].value_counts(normalize=True))
# 0 0.92
# 1 0.08 -> only 8% positive class为什么类别不平衡很重要
当负类占 92% 时,一个始终预测“否”的模型可以获得 92% 的准确率,却完全没有实用价值。这就是为什么您要尽早关注类别不平衡。
解决方法包括重采样(对少数类过采样/对多数类欠采样)、类别权重,或者使用精确率、召回率和 F1 等指标代替准确率。
互信息——衡量信息量
互信息衡量了解某个特征后,目标的不确定性减少了多少。与相关性不同,它还可以捕捉非线性关系。
对于分类目标,scikit-learn 提供了 mutual_info_classif。
from sklearn.feature_selection import mutual_info_classif
X = df[["balance", "tenure", "rooms"]]
y = df["churned"]
mi = mutual_info_classif(X, y, random_state=42)
print(dict(zip(X.columns, mi)))根据互信息对特征排序
将 MI 分数放入排序后的 Series 中,可以快速得到特征重要性排名。MI 越高,说明该特征包含的目标信息越多。
在训练任何模型之前,这是一个很好的早期筛选方法。
import pandas as pd
from sklearn.feature_selection import mutual_info_classif
mi = mutual_info_classif(X, y, random_state=42)
scores = pd.Series(mi, index=X.columns).sort_values(ascending=False)
print(scores)对偏态特征进行对数变换
右偏特征(收入、计数、价格)在进行对数变换后通常表现更好,因为这种变换会压缩长尾,使分布更接近对称形状。
请使用 np.log1p(1 + x 的对数),这样可以安全处理零值。
import numpy as np
df["income_log"] = np.log1p(df["income"])
print(df["income"].skew(), "->", df["income_log"].skew())变换前后:可视化变换效果
请始终通过绘制变换前后的图来确认变换确实有所帮助。对数变换后的版本应更接近对称的钟形曲线。
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 2)
df["income"].hist(ax=ax[0]); ax[0].set_title("Raw")
np.log1p(df["income"]).hist(ax=ax[1]); ax[1].set_title("log1p")
plt.show()快速检查:修正偏态特征
某个特征明显右偏,并且包含一些零值。
回顾:特征与目标分析
您已经学会将特征与预测目标联系起来:
- 使用散点图、KDE 图和箱线图观察特征与目标之间的信号
- 使用
value_counts(normalize=True)检测并量化类别不平衡 - 使用
mutual_info_classif根据信息量对特征排序,包括非线性关系 - 使用
np.log1p缓解特征的右偏
探索性数据分析到此完成。接下来:从 Web 应用程序编程接口收集数据。
常见问题解答
「特征分布与目标分析」课时是免费的吗?
是的 — 「特征分布与目标分析」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「特征分布与目标分析」这节课中我会学到什么?
分析特征与目标的关系、检测类别不平衡并计算互信息 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「特征分布与目标分析」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- EDA 工作流与数据概况分析
- 单变量分析
- 双变量与多变量分析
- 特征分布与目标分析