机器学习小项目之加利福尼亚房价数据分析
1. 安装必要的库
首先,确保安装了以下必要的 Python 库:
pip install scikit-learn pandas matplotlib
 
2. 导入所需库
在代码中,我们需要导入一些常用的库来处理数据、训练模型和评估结果:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing  # 加载加利福尼亚房价数据集
from sklearn.model_selection import train_test_split  # 划分训练集和测试集
from sklearn.linear_model import LinearRegression  # 线性回归模型
from sklearn.metrics import mean_squared_error, r2_score  # 评估指标
from sklearn.preprocessing import StandardScaler  # 特征标准化
 
3. 加载加利福尼亚房价数据集
使用 fetch_california_housing 函数加载加利福尼亚房价数据集:
# 加载加利福尼亚房价数据集
california = fetch_california_housing()
# 查看数据集的基本信息
print(california.DESCR)
 
california.DESCR 可以打印出数据集的详细描述,包括每个特征的含义。california.data 是特征数据,而 california.target 是房价中位数(目标变量)。
4. 创建 DataFrame
将加载的数据转换成 pandas 的 DataFrame 便于操作,并查看数据的前几行:
# 将数据转换为 DataFrame
df = pd.DataFrame(data=california.data, columns=california.feature_names)
# 添加目标变量(房价中位数)
df['PRICE'] = california.target
# 查看前五行数据
print(df.head())
 
这将输出类似如下的内容:
mathematica
   MedInc  HouseAge  AveRooms  AveOccup  ...  Longitude  Latitude  PRICE
0   8.3252     41.0     6.984  2.5550  ...   -122.23    37.88  4.526
1   8.3014     21.0     6.238  2.5470  ...   -122.22    37.86  3.585
2   7.2574     52.0     8.288  2.5450  ...   -122.24    37.85  3.521
3   5.6431     33.0     5.682  2.5470  ...   -122.25    37.85  3.413
4   3.8462     60.0     5.011  2.5470  ...   -122.25    37.85  3.422
 
5. 数据预处理
特征和目标变量
将特征(X)和目标变量(y)分开:
# 特征数据
X = df.drop('PRICE', axis=1)
# 目标变量(房价)
y = df['PRICE']
 
划分训练集和测试集
使用 train_test_split 将数据集划分为训练集和测试集,通常测试集占比 20% - 30%:
# 划分训练集和测试集,测试集占比 30%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 打印数据集大小
print(f"训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")
 
特征标准化
特征标准化可以帮助提高模型的收敛速度,并避免某些特征因为量纲问题主导模型。我们使用 StandardScaler 来对数据进行标准化:
# 初始化标准化器
scaler = StandardScaler()
# 拟合并转换训练集数据
X_train_scaled = scaler.fit_transform(X_train)
# 转换测试集数据
X_test_scaled = scaler.transform(X_test)
 
6. 训练线性回归模型
现在我们使用标准化后的数据来训练一个线性回归模型:
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train_scaled, y_train)
 
7. 预测与评估
模型训练完成后,使用测试集数据进行预测,并评估模型的性能:
# 用测试集数据进行预测
y_pred = model.predict(X_test_scaled)
# 计算均方误差 (MSE) 和均方根误差 (RMSE)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
# 计算 R² 分数
r2 = r2_score(y_test, y_pred)
# 打印评估结果
print(f"均方误差 (MSE): {mse:.2f}")
print(f"均方根误差 (RMSE): {rmse:.2f}")
print(f"R² 分数: {r2:.2f}")
 
- 均方误差 (MSE):衡量预测值和真实值之间的差异,越小越好。
 - 均方根误差 (RMSE):MSE 的平方根,使误差的单位与目标变量一致。
 - R² 分数:衡量模型的拟合度,越接近 1 表示模型越好。
 
8. 可视化结果
我们可以通过绘制真实房价与预测房价的对比图来直观地展示模型效果:
# 绘制真实值与预测值的对比图
plt.scatter(y_test, y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r--', lw=2)  # 添加对角线
plt.xlabel('真实房价')
plt.ylabel('预测房价')
plt.title('真实房价 vs 预测房价')
plt.show()
 
9. 完整代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
# 加载加利福尼亚房价数据集
california = fetch_california_housing()
# 将数据转换为 DataFrame
df = pd.DataFrame(data=california.data, columns=california.feature_names)
# 添加目标变量(房价中位数)
df['PRICE'] = california.target
# 查看数据前五行
print(df.head())
# 特征数据
X = df.drop('PRICE', axis=1)
# 目标变量(房价)
y = df['PRICE']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 标准化数据
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train_scaled, y_train)
# 预测房价
y_pred = model.predict(X_test_scaled)
# 评估模型
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
# 输出评估结果
print(f"均方误差 (MSE): {mse:.2f}")
print(f"均方根误差 (RMSE): {rmse:.2f}")
print(f"R² 分数: {r2:.2f}")
# 绘制对比图
plt.scatter(y_test, y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r--', lw=2)  # 添加对角线
plt.xlabel('真实房价')
plt.ylabel('预测房价')
plt.title('真实房价 vs 预测房价')
plt.show()
 


总结
在这个项目中,我们使用 加利福尼亚房价数据集 来实现一个 回归任务,通过 线性回归模型 来预测房价。整个过程包括:
- 数据加载
 - 数据预处理(特征和目标变量划分、数据标准化)
 - 模型训练
 - 模型评估与可视化
 
