后记:之前一直以为用的是TensorFlow,原来我用的是 Scikit-learn。两者都可以实现机器学习。前者更适合实现深度神经网络。更正题目。
已经搭建好环境,开始学习加州房价机器学习例子,目标理解相关概念,掌握机器学习例子开发流程! 加油,每天一点点进步!
学习前的几点困惑?怎么训练数据集?怎么清洗数据?这个例子用的是线性回归模型?可不可以用别的模型呢?用这个例子的框架,可不可以换成我自己的一个数据集呢,不是房价的,其他的数据,是不是要修改一些属性,模型本身不用变吧,工作量有多大?怎样让我的应用程序调用这个机器学习例子吗?有接口吗?好多疑问,期待学习之后能够找到答案!
加油!
2025.4.15
参考网址:
按照教程继续补全加州房价例子代码,运行看看结果,边做边学吧!
查看数据统计信息,成功,
增加可视化分布代码,运行失败,提示少matplotlib,用pip安装,再运行,出错,提示少seaborn,继续pip安装,再运行,终于成功了




相关性分析,增加代码,运行成功,但需要关闭上一个柱状图窗口才能看到运行结果
数据清洗与预处理
检查缺失值,成功

数据标准化,运行之后没看到什么结果!待分析
训练一个简单的模型,划分数据集,训练线性回归模型,运行成功

感受:比预想的简单,训练一个线性回归模型,几行代码就实现了,可是很多不明白
线性回归模型不太了解
python编程没学过,代码语法不清楚
数据集格式是是啥,不清楚
怎么输出参数及其权重?哪个参数对房价影响最大,在哪里看,用什么代码?
如果构建自己的模型,改改算法,怎么办?
后记:
-
Scikit-learn:传统机器学习工具箱
-
范围:专注于经典机器学习算法,如逻辑回归、支持向量机、随机森林、K-Means 聚类、PCA 降维等。
-
设计理念:易用性和一致性。它提供了统一的 API(
fit、predict、transform),让你可以像搭积木一样快速尝试各种算法。它不专注于深度学习(虽然有多层感知机,但功能较弱)。 -
适合人群:数据清洗、特征工程、快速建模和模型评估。
-
-
TensorFlow:深度学习框架
-
范围:专注于构建和训练复杂的神经网络,如卷积神经网络(CNN)、循环神经网络(RNN)、Transformer(BERT、GPT 等)以及大规模的分布式训练。
-
设计理念:灵活性和可扩展性。它允许你自定义网络层、损失函数、训练循环,并且能利用 GPU/TPU 加速大规模矩阵运算。
-
适合人群:图像识别、自然语言处理、语音识别等需要深层网络和海量数据的场景。
-
| 特性 | Scikit-learn | TensorFlow |
|---|---|---|
| 核心数据结构 | NumPy 数组、Pandas DataFrame | Tensor(张量) |
| 主要算法 | 逻辑回归、SVM、随机森林、KNN | CNN、RNN、LSTM、Transformer |
| 计算方式 | 通常在 CPU 上运行(部分支持多核) | 原生支持 GPU/TPU 加速 |
| 模型规模 | 适合中小型数据(通常内存能放下) | 适合海量数据和超大模型 |
| 定制化程度 | 低(算法已经封装好,调参为主) | 高(可以自定义任何计算细节) |
| 能否支持反向传播 | 不能(或不擅长)自动微分 | 核心功能就是自动微分与梯度下降 |
2026年4月7日
时隔快一年,又跑了一个更简单的波士顿房价预测,取长补短,对该加州房价程序进行优化。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# ========== 1. 加载数据 ==========
file = r'D:\MyAI\mytest\mytestdata.csv'
df = pd.read_csv(file)
# 目标变量列名(加州数据集通常是 medianHouseValue)
target_column = 'medianHouseValue'
# 打印数据基本信息
print("=" * 50)
print("数据基本信息")
print("=" * 50)
print(f"数据形状 (行, 列): {df.shape}")
print(f"\n数据列名: {df.columns.tolist()}")
print(f"\n目标变量列: {target_column}")
print("\n数据预览 (前5行):")
print(df.head())
# ========== 2. 数据探索 ==========
print("\n" + "=" * 50)
print("数据统计信息")
print("=" * 50)
print(df.describe())
# 检查缺失值(改进点1:逐列显示缺失情况)
print("\n" + "=" * 50)
print("缺失值检查")
print("=" * 50)
missing_counts = df.isnull().sum()
print(missing_counts[missing_counts > 0] if missing_counts.sum() > 0 else "没有缺失值!")
# 处理缺失值(改进点2:用中位数填充,像波士顿那样)
print("\n" + "=" * 50)
print("缺失值处理(使用中位数填充)")
print("=" * 50)
for column in df.columns:
if df[column].isnull().any():
median_value = df[column].median()
df[column].fillna(median_value, inplace=True)
print(f" 列 '{column}' 已用中位数 {median_value:.2f} 填充")
# 再次检查
print(f"\n处理后缺失值总数: {df.isnull().sum().sum()}")
# ========== 3. 可视化分析 ==========
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 3.1 目标变量分布图
print("\n" + "=" * 50)
print("绘制目标变量分布图")
print("=" * 50)
sns.histplot(df[target_column], kde=True, bins=30)
plt.title("加州房价分布图")
plt.xlabel("房价(美元)")
plt.ylabel("频数")
plt.show()
# 3.2 特征相关性热力图(改进点3:加上相关系数标注)
print("\n" + "=" * 50)
print("绘制特征相关性热力图")
print("=" * 50)
plt.figure(figsize=(12, 10))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)
plt.title("特征相关性热力图")
plt.show()
# ========== 4. 特征标准化(最佳实践:先划分再标准化) ==========
print("\n" + "=" * 50)
print("特征标准化(先划分再标准化,避免数据泄露)")
print("=" * 50)
# 分离特征和目标变量
features = df.drop(target_column, axis=1)
target = df[target_column]
# 先划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
features, target, test_size=0.2, random_state=42
)
print(f"训练集大小: {X_train.shape[0]} 样本")
print(f"测试集大小: {X_test.shape[0]} 样本")
# 标准化:用训练集拟合,同时转换训练集和测试集
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) # 只在训练集上fit
X_test_scaled = scaler.transform(X_test) # 用同样的scaler转换测试集
print(f"特征标准化完成")
print(f" 训练集特征均值: {X_train_scaled.mean(axis=0).mean():.4f}")
print(f" 训练集特征标准差: {X_train_scaled.std(axis=0).mean():.4f}")
# ========== 5. 训练模型 ==========
print("\n" + "=" * 50)
print("训练线性回归模型")
print("=" * 50)
model = LinearRegression()
model.fit(X_train_scaled, y_train)
print("模型训练完成!")
# ========== 6. 预测 ==========
y_pred = model.predict(X_test_scaled)
print("\n预测结果(前10个):")
print(y_pred[:10])
# ========== 7. 评估模型(改进点4:增加更多评估指标) ==========
print("\n" + "=" * 50)
print("模型评估指标")
print("=" * 50)
SSE = sum((y_test - y_pred) ** 2)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
print(f'SSE (误差平方和): {SSE:.2f}')
print(f'MSE (均方误差): {mse:.2f}')
print(f'RMSE (均方根误差): {rmse:.2f}')
print(f'R² 分数: {r2:.4f}')
# ========== 8. 模型参数分析(改进点5:动态输出,不再硬编码) ==========
print("\n" + "=" * 50)
print("模型参数")
print("=" * 50)
feature_names = features.columns.tolist()
print("\n各特征系数:")
for i, (name, coef) in enumerate(zip(feature_names, model.coef_)):
print(f" {name:15} 系数: {coef:10.4f}")
intercept = model.intercept_
print(f"\n截距 (intercept): {intercept:.4f}")
# 动态构建回归方程
equation = f"回归方程式: 房价 = {intercept:.4f}"
for name, coef in zip(feature_names, model.coef_):
sign = "+" if coef >= 0 else "-"
equation += f" {sign} ({abs(coef):.4f} × {name})"
print(f"\n{equation}")
# 特征重要性排序(基于系数绝对值)
print("\n特征重要性排序(系数绝对值越大越重要):")
feature_importance = sorted(
zip(feature_names, model.coef_),
key=lambda x: abs(x[1]),
reverse=True
)
for name, coef in feature_importance:
print(f" {name:15}: {coef:10.4f}")
# ========== 9. 可视化分析(改进点6:增加残差图) ==========
print("\n" + "=" * 50)
print("可视化分析")
print("=" * 50)
# 9.1 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
scatter = plt.scatter(y_test, y_pred, c=y_pred, cmap='viridis', alpha=0.7, edgecolors='w', s=50)
plt.xlabel('实际房价(美元)')
plt.ylabel('预测房价(美元)')
plt.title('加州房价:实际值 vs 预测值')
# 添加理想预测参考线
min_val = min(y_test.min(), y_pred.min())
max_val = max(y_test.max(), y_pred.max())
plt.plot([min_val, max_val], [min_val, max_val], color='red', lw=2, label='理想预测线')
plt.legend()
plt.grid(True, alpha=0.3)
plt.colorbar(scatter, label='预测房价(美元)')
plt.show()
# 9.2 残差图(波士顿有的,加州原来没有)
plt.figure(figsize=(10, 6))
residuals = y_test - y_pred
plt.scatter(y_pred, residuals, alpha=0.7, edgecolors='w', s=50)
plt.axhline(y=0, color='red', linestyle='--', linewidth=2)
plt.xlabel('预测房价(美元)')
plt.ylabel('残差(实际值 - 预测值)')
plt.title('残差分布图')
plt.grid(True, alpha=0.3)
# 添加残差分布的简单说明
mean_residual = residuals.mean()
std_residual = residuals.std()
plt.text(0.95, 0.95, f'残差均值: {mean_residual:.2f}\n残差标准差: {std_residual:.2f}',
transform=plt.gca().transAxes, verticalalignment='top', horizontalalignment='right',
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
plt.show()
print("\n" + "=" * 50)
print("模型训练完成!")
print("=" * 50)
主要改进点对比
| 改进点 | 原加州代码 | 优化后加州代码 | 借鉴自波士顿 |
|---|---|---|---|
| 缺失值处理 | ❌ 只检查不处理 | ✅ 中位数填充 | 波士顿 |
| 数据信息输出 | ⚠️ 简略 | ✅ 形状、列名、缺失详情 | 波士顿 |
| 标准化方式 | ⚠️ 先标准化再划分 | ✅ 先划分再标准化(最佳实践) | 优化 |
| 特征系数输出 | ❌ 手动硬编码8行 | ✅ 动态循环输出 | 波士顿 |
| 回归方程式 | ⚠️ 手动拼接 | ✅ 动态构建(支持任意特征数) | 波士顿 |
| 特征重要性排序 | ❌ 没有 | ✅ 按系数绝对值排序 | 波士顿 |
| 残差图 | ❌ 没有 | ✅ 完整残差分析 | 波士顿 |
| 评估指标 | ⚠️ 只有MSE和R² | ✅ 增加SSE、RMSE | 波士顿 |
8795



被折叠的 条评论
为什么被折叠?



