☰
matplotlib与Seaborn实战:房价预测中的探索性数据分析与特征工程
2026/10/14 9:31:01 网站建设 项目流程

房价项目做到第四步,数据清洗和基础特征工程基本跑通了,接下来要面对的是一个很现实的问题:你手上有一堆数值、一堆表格,但你根本不知道这些数据到底长什么样、分布是否合理、哪些特征和目标房价之间有真实关联。这时候再往下建模,基本就是闭着眼睛开车。我见过不少初学者上来就对着训练集一顿fit,最后模型跑完看分数,发现预测结果离谱得没法解释——回头一查,离群值没处理、特征严重偏态、分类变量编码方式不对,根子全出在没认真做探索性数据分析这一步。

这一篇我用房价预测项目当例子,把matplotlib和Seaborn怎么用在真实数据挖掘流程里讲清楚。不是光给你罗列API,而是按照一个完整的探索性分析流程走一遍:先看单变量分布,再看特征和目标之间的关系,然后考察相关性、找离群值,最后用可视化指导特征工程。学完这一篇,你手里那堆表格会真正“活”过来,变成可以指导决策的直观信息。

1. 可视化在房价预测项目中的定位

1.1 为什么建模前必须做数据可视化

很多人对可视化的理解停留在“出图给汇报用”,我刚开始学数据挖掘时也这么想:明明可以直接算统计量,偏度用skew函数一调就出来,相关系数用corr一下就得到矩阵,为什么非要费劲画图?

等你真跑过一两个完整项目就会意识到,统计量是“压缩过的信息”,它告诉你结果,却不告诉你数据内部长什么样。举个最典型的场景:两个特征的均值、方差完全相同,但一个服从正态分布,一个是双峰分布,这在实际业务里代表完全不同的两种模式。比如房价数据里某个区域的房价,可能因为学区因素形成两个明显的高峰——普通房和学区房价格区间差异极大。如果只看均值和方差,你会觉得这片区域房价很“平均”,但实际上内部结构完全不同。这种信息,只有直方图和密度曲线能直观告诉你。

具体到房价预测项目,可视化承担三个核心作用:

第一,检查数据质量。有没有明显的数据录入错误?比如房价出现个位数、面积出现负数,这种通过箱线图、直方图一眼就能发现。第二,发现分布形态。线性回归这类模型对特征分布比较敏感,严重偏态的特征通过log变换可以显著提升模型表现,但该变换哪些特征,不是拍脑袋决定的,要看分布图。第三,启发特征构造。散点图里明显的非线性关系,提示你可以构造交互特征或用多项式回归;残差图里有明显趋势,说明模型形式有问题。

这一环节和建模分析是直接连着的,是一件事的两头。

1.2 可视化如何影响后续特征工程

我在做房价项目时有一个特别的感触:特征工程不是等模型效果差了才回头补,而是从可视化阶段就开始了。

举个例子,项目里有一个特征是“房龄”(房屋建成年份),直接拿这个列去做归一化然后扔给模型,信息利用率非常低。但如果你画出房龄和房价的散点图,会发现一个有意思的现象:新建成的房子和有一定年头的老房子价格都偏高,中间年代段的房子价格反而低。这很可能是某些城市发展的实际规律——老城区配套成熟的房子溢价高,新建商品住宅溢价也高,中间过渡段的房子两边不靠。这个明显的倒U型关系提示你可以构造一个分段特征或二次项特征。

这种发现不是靠算出来的,是靠眼睛看出来的。我会在后面的章节详细展示这个处理过程。

另外,通过可视化你还能判断特征和目标的关联强度。如果画出某特征和房价的散点图,发现完全是一团乱云,没有任何可辨别的趋势,那这个特征在第一轮建模时就可以考虑不加。这样可以避免把无关特征丢进模型,减少噪声和过拟合风险。

2. matplotlib基础绘图实战

2.1 画布、坐标轴与基础设置入门

matplotlib是Python可视化的底座,Seaborn很多底层能力也依赖它。很多教程上来就让你画图,把plt.plot()一调就完事,但真到一个完整项目中,你会发现控制画布、坐标轴这些基础设置才最影响出图效率。

先弄明白一个核心逻辑:matplotlib绘图,本质上是在一张画布(figure)上创建坐标轴(axes),然后在坐标轴上绘制内容。用一个生活类比:figure是整张纸,axes是纸上的一块区域,你在纸上画了几个框,每个框里放一张小图。一图多子图的布局,玩的就是这个逻辑。

import matplotlib.pyplot as plt import numpy as np import pandas as pd # 基础画布设置 fig, ax = plt.subplots(figsize=(10, 6)) # figsize控制画布尺寸,单位是英寸,10x6是常见尺寸 # 过小的画布会让图表显得拥挤,过大的又会在网页端显示不协调 # 绘制示例数据 x = np.linspace(0, 10, 100) y = x ** 2 ax.plot(x, y, label='y=x^2', color='#2E86AB', lw=2) ax.set_title('示例:一元二次函数曲线', fontsize=14) ax.set_xlabel('x', fontsize=12) ax.set_ylabel('y', fontsize=12) ax.legend(fontsize=11) ax.grid(True, linestyle='--', alpha=0.6) plt.tight_layout() plt.show()

这里有一个实战中的细节:plt.tight_layout()。刚画图时我不明白为什么有时候图例和标题会被截断,后来才知道因为画布内置的布局参数没优化,这张代码能解决大部分“文字被切掉”的问题。

画布创建有两种习惯:一种是直接用plt.plot()这种pyplot接口,快速出图;另一种是先用subplots创建画布和坐标轴对象,再基于坐标轴对象绘图。我建议从学习阶段就养成后者的习惯。因为到后面要微调坐标轴、共用图例、做复杂布局,基于对象的方式控制力更强,代码也更规范。

2.2 直方图与箱线图:快速洞察变量分布

房价项目里,第一步要看的通常是目标变量本身——房价的分布。这决定了你后续建模的基本策略。

import pandas as pd import matplotlib.pyplot as plt # 加载已清洗的房价数据(假设包含price列) df = pd.read_csv('house_price_clean.csv') fig, axes = plt.subplots(1, 2, figsize=(14, 5)) # 左图:直方图 axes[0].hist(df['price'], bins=50, edgecolor='white', color='#2E86AB') axes[0].set_title('房价分布直方图') axes[0].set_xlabel('房价') axes[0].set_ylabel('频数') # 右图:箱线图 axes[1].boxplot(df['price'], vert=True) axes[1].set_title('房价箱线图') axes[1].set_ylabel('房价') plt.tight_layout() plt.show()

直方图的bins参数值得专门说一下。bins数太少会掩盖数据的细节分布,太多又会被噪声干扰。房价数据一般是几百到几千条,bins取30~60比较合理。你可以在代码里多试几组参数,看看哪个尺度下数据模式最清楚。

箱线图的价值在于异常值识别。箱线图从下到上依次是下边缘、Q1、中位数、Q3、上边缘,超出上下边缘的点被标记为离群点。在房价项目里,这些离群点子不能简单地删除——它们可能是真实存在的高端楼盘或特殊房产,需要结合业务场景判断。我处理时会先把离群点单独拿出来看一下对应的是哪些样本,再决定是保留、删除还是做单独处理。

当时我的做法是:

# 查看房价的统计描述 print(df['price'].describe()) # 识别箱线图中的离群点 Q1 = df['price'].quantile(0.25) Q3 = df['price'].quantile(0.75) IQR = Q3 - Q1 outlier_mask = (df['price'] < Q1 - 1.5 * IQR) | (df['price'] > Q3 + 1.5 * IQR) outliers = df[outlier_mask] print(f"离群点数量:{len(outliers)}") print(outliers[['price', 'area', 'location']].head())

这里用1.5倍IQR标准识别离群点,是统计学常用的经验法则。但注意,这个标准是用来提示你关注异常样本,不是自动决定删除的依据。我看到很多项目里盲目删离群点,结果删掉了真实存在的有价值数据,最后模型泛化能力反而下降。

2.3 散点图与子图布局:初探特征与房价的关系

分析单个特征分布的下一步,是考察每个特征和目标变量的关系。散点图是最直接的工具。

fig, axes = plt.subplots(2, 3, figsize=(18, 10)) # 2行3列的子图布局 features = ['area', 'bedrooms', 'bathrooms', 'age', 'distance_to_center', 'floor'] for i, feat in enumerate(features): row, col = divmod(i, 3) axes[row][col].scatter(df[feat], df['price'], alpha=0.5, s=10) # alpha控制透明度,s控制点的大小 axes[row][col].set_xlabel(feat) axes[row][col].set_ylabel('price') for xx in axes[row][col].get_xticklabels(): xx.set_rotation(45) plt.tight_layout() plt.show()

alpha参数很重要。当数据量超过几百条后,散点图会出现严重的重叠现象,点压着点,你根本看不清密度差异。调低alpha相当于让点变得半透明,重叠区域会显示得更深,密度信息就体现出来了。

我画散点图时习惯配上趋势线,用numpy的polyfit拟合一条一次曲线叠加上去,能快速看出整体趋势。matplotlib本身不提供绘图风格的统计回归线,但用Seaborn的regplot一行就能实现,后面会讲到。

子图布局方面,plt.subplots(2, 3)生成了六个坐标轴对象,我用divmod(i, 3)来计算每个特征应该放在第几行第几列。这个方法在特征数量比较多时非常实用,避免手写六个独立的subplot调用。

3. Seaborn统计可视化进阶

3.1 regplot与lmplot:回归关系一目了然

如果要用一个字形容Seaborn,那就是“省事”。它内置了很多统计计算的逻辑,比如regplot会自动做线性拟合,并把置信区间一并画出来。这对于探索性分析来说效率极高。

import seaborn as sns # 设置Seaborn风格 sns.set_theme(style='whitegrid', palette='muted') # 单特征回归图 fig, ax = plt.subplots(figsize=(8, 6)) sns.regplot(data=df, x='area', y='price', ax=ax, scatter_kws={'alpha': 0.5, 's': 15}, line_kws={'color': '#D1495B', 'lw': 2}) ax.set_title('面积与房价的关系') plt.show()

regplot自动完成了几件事:绘制散点、拟合线性回归线、画出置信区间阴影。这在探索阶段帮了我大忙——不用手动计算回归系数,一眼就能看出面积和房价是否线性相关、置信区间宽窄如何。

置信区间宽,说明这个特征对房价的解释能力弱,或者数据量不够;置信区间窄,说明关系比较稳定。我观察房价面积数据时发现,置信区间整体还比较窄,但两头变宽,这符合统计规律:样本量在两端的支撑比较少,估计更不稳定。

lmplot是regplot的加强版本,支持按第三个变量分组绘图:

sns.lmplot(data=df, x='area', y='price', hue='is_school_district', # 是否学区房 height=6, aspect=1.4, scatter_kws={'alpha': 0.5}, palette='Set1') plt.show()

这个图极其适合在项目里做初步分组分析。你会清楚地看到学区房和非学区房两组数据的回归线斜率不同,直观说明学区因素调节了面积对房价的影响。这个发现引导我构造了面积和学区是否的交互特征,最终建模时该特征重要性排到了前几位。

3.2 热力图与相关性矩阵:锁定核心特征

特征之间的相关性分析是特征筛选的重要依据。Seaborn的heatmap配合pandas的corr方法,是我做任何项目几乎必出的第一张图。

# 选择数值特征 numeric_cols = ['price', 'area', 'bedrooms', 'bathrooms', 'age', 'distance_to_center', 'floor', 'total_floors', 'is_school_district'] corr_matrix = df[numeric_cols].corr() plt.figure(figsize=(12, 9)) sns.heatmap(corr_matrix, annot=True, # 在格子中标注数值 fmt='.2f', # 保留两位小数 cmap='RdBu_r', vmin=-1, vmax=1, square=True, # 让格子是正方形 cbar_kws={'shrink': 0.8}) plt.title('房价数据特征相关性热力图') plt.tight_layout() plt.show()

热力图解读有几个关键操作。先看最下面一行或者最右边一列,这是所有特征和price的相关系数,优先找相关系数绝对值高于0.3的特征,这些是对目标变量有初步预测潜力的特征。再看特征和特征之间有没有高度相关的。

特征间高度相关会产生两个问题。一个是多重共线性,在线性回归中系数估计会变得不稳定,原来该显著的变量变得不显著。另一个是信息冗余,这些高度相关的特征本质上是同一个信息的重复表达,放进模型不但没有贡献,还会拖慢训练速度。

我当时的做法是设定一个相关系数阈值0.8,把和某个核心特征相关系数超过阈值的特征合并或者只保留其中一个。比如建筑面积和房间数量相关系数到了0.82,就说明两者信息重叠度高,保留面积就行,不再单独加入房间数。

3.3 分类变量的可视化对比

房价预测项目里少不了一些分类变量,比如房屋朝向、所在区域、是否临地铁。这些变量和房价的关系不适合用散点图看,更好的选择是箱线图或者小提琴图。

Seaborn的boxplot支持按分类变量分组:

plt.figure(figsize=(10, 6)) sns.boxplot(data=df, x='district', y='price', palette='Set2') plt.xticks(rotation=45) plt.title('不同区域房价对比') plt.tight_layout() plt.show()

分类变量之间如果类别太多,条形图会不好看,箱线图就更有优势。每个箱线图展示了中位数、四分位距、离群点等信息,我可以一眼看出哪个区域房价中位数高、哪些区域内部差异大。

小提琴图(violinplot)是多一层信息的箱线图,在一个箱线图的基础上叠加了核密度估计的旋转对称表示,能同时展示分布形态。我在做朝向和房价的分析时发现,朝南的房价分布是中位数高、分布也比较集中,朝北的则是中位数低、并出现明显长尾。这个信息纯粹靠箱线图不够直观,但小提琴图一下就看出来了。

plt.figure(figsize=(10, 6)) sns.violinplot(data=df, x='orientation', y='price', palette='muted', inner='quartile') plt.title('不同朝向房价分布(小提琴图)') plt.tight_layout() plt.show()

4. 可视化驱动特征工程的实战流程

4.1 偏度与分布形态的判断

完成基础可视化后,你会积累一堆发现,下一步要用这些发现指导特征工程。第一个重要任务是判断哪些特征偏态严重、需要做变换。

偏度是描述分布不对称程度的统计量,偏度大于1表示强正偏态。在房价数据里,房价本身、面积、距市中心距离这些变量通常都是正偏态。这时如果用原始值喂给线性模型,效果会很差,因为模型本质上是基于均值回归的,对极端值非常敏感。

我的操作方法是先画出所有数值特征的直方图,做成一个大子图网格,再结合skew函数量化:

from scipy.stats import skew numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist() skew_data = [] for col in numeric_cols: s = skew(df[col].dropna()) if abs(s) > 0.5: skew_data.append((col, s)) print("偏度大于0.5的特征:") for col, s in sorted(skew_data, key=lambda x: -abs(x[1])): print(f"{col}: {s:.2f}")

对于偏度较高的特征,最常见的处理是对数变换。但有个细节我一直提醒自己:先看图再决定怎么做。有些特征是轻度偏态,不一定非要做变换;有些特征取log后分布明显更接近正态,这才值得变换。

我一般是在同一张图上画出原始值和log变换后的直方图对比,然后决定:

fig, axes = plt.subplots(1, 2, figsize=(14, 5)) axes[0].hist(df['price'], bins=50, color='#2E86AB', edgecolor='white') axes[0].set_title('原始房价分布') axes[1].hist(np.log1p(df['price']), bins=50, color='#D1495B', edgecolor='white') axes[1].set_title('log1p变换后房价分布') plt.tight_layout() plt.show()

这里用np.log1p而不是np.log,是因为房价有可能存在值为0的样本(虽然清洗时应该处理过,但以防万一)。log1p计算的是ln(1+x),x为0时结果也为0,不会出现负无穷。这个处理在最后把预测结果还原时要用np.expm1反向操作:predict_price = np.expm1(model.predict(X_test))。

4.2 离群值的可视化识别与处理策略

离群值的识别不能只看单变量的箱线图。进阶做法是看多变量联合分布,孤立点会在二维散点图中原形毕露。

我遇到过一个典型的场景:面积对房价的散点图中,绝大多数点集中在面积50~150平方米、价格在100万~500万的范围,但有极少数点面积超过300但价格极低。这些点明显不是正常的市场数据,很可能是数据录入错误或者特殊交易(比如亲属过户)。用箱线图看面积变量可能只发现几个孤立点,但放在面积-房价散点图里,这种异常模式就非常明显。

处理这类离群值时,我的流程是:

先建立一个“异常样本清单”,把散点图中视觉上远离主体的样本全部计数并把索引记录下来。然后逐个查看这些样本的完整信息,看各特征组合是否合理。比如面积300平米但价格还不到50万,这个组合在市场中基本不可能出现,属于录入错误的可能性极高。再看这些异常样本占总样本的比例,如果超过5%,就要小心了,直接删除可能丢失重要信息,需要分组分析——比如高档豪宅面积大且价格也高,这不是离群值,而是少数但真实的样本。

# 用Z-score方法做初步筛选 from scipy.stats import zscore df['price_z'] = zscore(df['price']) df['area_z'] = zscore(df['area']) # 找出价格和面积都极端偏离的样本 extreme_mask = (df['price_z'].abs() > 3) & (df['area_z'].abs() > 3) print(df[extreme_mask][['price', 'area', 'district', 'build_year']])

Z-score超过3的样本在正态分布假设下已经属于极小的概率事件,但更可靠的判断方法始终是结合业务领域知识。

4.3 可视化指导下的特征构造

这一节是探索性分析直接产出价值的环节,我把当时做过的特征工程按可视化的驱动逻辑拆成几类。

第一类是组合特征。比如“单价”这个特征,本质上是价格除以面积得到的单位面积价格。如果你画出房价和面积的散点图,会发现散点带有明显的扇形状。面积越大,价格波动范围越大,这说明原始的价格变量包含了面积的影响,而回归模型预测单价反而更稳定。我当时在项目里同时尝试了以总价和单价作为目标变量,对比不同方案的误差和可解释性,最后选择了单价作为建模目标。

第二类是二次项特征。接前面说的房龄与房价倒U型关系,在散点图里观察到一个峰值后,我在特征列表里增加了房龄的平方项。这类非线性关系用线性模型表达不出来,但增加多项式特征后,模型的拟合能力立刻上一个台阶。我的做法是:

# 增加特征:房龄的平方 df['age_squared'] = df['age'] ** 2 # 增加特征:楼层的占比 df['floor_ratio'] = df['floor'] / df['total_floors']

第三个是分组聚合特征。可视化发现某些区域房价内部差异极大,这时候可以针对区域编码类别特征,或者用目标编码、频率编码来捕捉区域信息。如果画图发现同一特征在不同类别下和目标变量的关系呈现出完全相反的斜率,说明有必要做分组模型或引入交互项。

交互特征这个点值得展开说一下。在lmplot里我观察到学区房和非学区房的面积-价格回归线斜率不同,于是构造了一个交互特征:area * is_school_district。这个特征进入模型后,重要性排到了前几位。这类发现如果纯靠数据自动筛选,往往会被埋没在特征列表里,但可视化能让你亲眼看到它的存在。

from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 构造交互特征 df['area_school_interact'] = df['area'] * df['is_school_district'] # 简单验证特征效果 features_v1 = ['area', 'bedrooms', 'bathrooms', 'age', 'distance_to_center'] features_v2 = features_v1 + ['area_school_interact'] X1 = df[features_v1] X2 = df[features_v2] y = df['price'] X1_train, X1_test, y1_train, y1_test = train_test_split(X1, y, test_size=0.2, random_state=42) X2_train, X2_test, y2_train, y2_test = train_test_split(X2, y, test_size=0.2, random_state=42) # 简化验证,不做过多的预处理 baseline = LinearRegression().fit(X1_train, y1_train) improved = LinearRegression().fit(X2_train, y2_train) print("baseline RMSE:", mean_squared_error(y1_test, baseline.predict(X1_test), squared=False)) print("with_interact RMSE:", mean_squared_error(y2_test, improved.predict(X2_test), squared=False))

这里要说明一下,上面这个对比只是非常粗略的验证,没有对特征做标准化、也没有处理偏度,真实建模时你会有更完整的pipeline。但用来快速验证一个特征有没有用,已经足够了。

5. 常见问题与排查技巧实录

5.1 图表不显示或中文乱码的解决办法

刚开始用matplotlib时,一个高频问题是不显示报错或者中文乱码。不显示有很多原因,但最常见的只有几种。

如果你用的是脚本方式运行,比如Python脚本py file.py,你需要plt.show()才可以弹出窗口;如果你在Jupyter里跑,光有代码块没有%matplotlib inline这种魔法命令,也可能看不到图。现在的Jupyter版本通常默认就支持内联显示,但老版本还是需要手动加。

中文乱码问题则是另一个经典坑。matplotlib默认字体不支持中文,你在图上写“房价”“面积”这些标签,出来的全是方框。解决方式是在代码开头重新设置字体:

import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Noto Sans CJK SC'] plt.rcParams['axes.unicode_minus'] = False

第一行指定中文字体,第二行让负号正常显示。不同系统支持的中文字体不同,Windows一般是SimHei或Microsoft YaHei,Linux需要安装文泉驿或者Noto系列。如果字体指定不对,画出来依然会是方框——先用下述代码验证当前环境有没有可用的中文字体:

from matplotlib.font_manager import fontManager import matplotlib.font_manager as fm fonts = [f.name for f in fm.fontManager.ttflist] # 查看中文字体是否在列表里 cjk_fonts = [f for f in fonts if 'Hei' in f or 'YaHei' in f or 'CJK' in f or 'Noto' in f] print(cjk_fonts)

如果没有中文字体,安装一个即可。不建议全程用英文标签回避这个问题,因为图是要自己看、要给别人讲的,中文标签的表达效率远高于英文。

5.2 数据量大时绘图卡顿的优化

房价项目数据集通常不算大,但数据挖掘课里你可能会遇到百万级的模拟数据。这时候散点图直接画,会卡到你怀疑人生,因为matplotlib默认会把每个点都画出来,几十万个点的渲染开销非常大。

解决思路是降采样。不是减少信息量,而是在可接受的信息损失范围内减少点的数量。

# 随机抽样1万条进行可视化 df_sample = df.sample(n=10000, random_state=42) plt.figure(figsize=(10, 6)) plt.scatter(df_sample['area'], df_sample['price'], alpha=0.3, s=5) plt.xlabel('area') plt.ylabel('price') plt.show()

另一个思路是改用Seaborn的jointplot或者hexbin图:

sns.jointplot(data=df_sample, x='area', y='price', kind='hex', height=8) plt.show()

hexbin把平面划分成六边形格子,按格子内的点数着色,上百个点的重叠信息在这一张图里完全展示出来。bin的默认数量可能不够,可以先跑一次看效果,再用gridsize参数调整。

5.3 用可视化提升模型可解释性

房价项目如果只用线性回归,你还可以画特征重要性图或者系数图,直观展示每个特征对预测结果的影响方向。这不算严格的探索性分析了,但非常值得做。

我用的方法是训练完线性回归后,把系数画成水平条形图:

coef_df = pd.DataFrame({ 'feature': feature_names, 'coef': model.coef_ }).sort_values('coef', ascending=True) plt.figure(figsize=(10, 8)) colors = ['#D1495B' if c < 0 else '#2E86AB' for c in coef_df['coef']] plt.barh(coef_df['feature'], coef_df['coef'], color=colors) plt.axvline(x=0, color='black', lw=1) plt.xlabel('回归系数') plt.title('线性回归特征系数') plt.tight_layout() plt.show()

这张图一出来,每个特征的贡献方向就清清楚楚。距离市中心越远房价越低、面积越大房价越高、楼栋总层数越高反而价格越低(高层住宅密度大、公共区域多,单价反而分摊),这些细节直接让你的分析在项目评审时有底气和说服力。

注意:这些可视化决策并非只服务建模环节。探索性分析的目的从来不是“画图交差”,而是发现数据中的信息结构。图表只是载体,结论才是核心。在写报告或做演示时,把关键图表和对应结论放一起,一个图讲一件事,这比堆一屏图表强十倍。

6. 个人经验与最终建议

房价预测项目做到可视化这一阶段,我的体会是:你不需要把所有图表都做一个遍。很多人容易陷入画图自嗨的陷阱,今天画个热力图,明天画个小提琴图,后天再来个联合分布图,看着挺热闹,到头来这些图对建模没有形成任何决策指导。

我在实际操作中的策略是带着三个具体问题去画图——目标变量长什么样?哪些特征和目标有真实关联?哪些特征需要变换或筛选?带着问题画,画完马上记录结论,然后把这些结论落实到特征工程和建模方案中。这样每一张图都有明确的“下一步动作”,而不是看个热闹。

最后再分享一个效率技巧:把常用的绘图函数封装成一个工具模块,比如eda_plot.py,里面写好plot_distribution、plot_correlation、plot_relationship这样几个常用函数。后续换数据集、换项目,直接import调用,能省下大量的重复代码时间。我在做房价项目之后换过好几个数据集,这套封装好的可视化工具一直在用,效果非常稳定。

可视化和数据挖掘是一个反复迭代的过程。不要指望第一次画图就能抓到所有模式,有些关系需要你在不同分组、不同变换下反复观察才会浮现。保持这个循环:看图、记录发现、调整特征、再建模验证,一套完整的流程走下来,你对数据的理解会比任何单纯跑模型的人都深。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询