机器学习—模型选择与优化7-1(k-fold交叉验证法)
使用k-fold交叉验证法选择最优钻石价格模型
主要步骤流程:
- 1. 导入包
- 2. 导入数据集
- 3. 数据预处理
- 3.1 处理缺失数据
- 3.2 处理类别型字段
- 3.2.1 统计类别型字段
- 3.2.2 字符编码和独热编码
- 3.3 生成自变量和因变量
- 3.4 拆分数据集
- 3.5 特征缩放
- 4. 构建不同的模型并调用k折交叉验证
- 4.1 构建随机森林模型并调用k折交叉验证
- 4.2 构建多元线性回归模型并调用k折交叉验证
- 4.3 构建SVM模型并调用k折交叉验证
- 5. 比较3个模型的性能
1. 导入包
In [1]:
# 导入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
2. 导入数据集
In [2]:
# 导入数据集
dataset = pd.read_csv('diamonds.csv')
dataset
Out[2]:
3. 数据预处理
3.1 处理缺失数据
In [3]:
# 统计缺失数据
dataset.isnull().sum()
Out[3]:
没有任何一个字段有缺失值
In [4]:
# 找出业务不合理的数据
xyz_zero_df = dataset.query('x < 0.01 or y < 0.01 or z < 0.01')
xyz_zero_df
Out[4]:
x < 0.01 或者 y < 0.01 或者 z < 0.01,这些数据不符合业务场景,且数据量比较少,故直接删除。
In [5]:
dataset = dataset.drop(xyz_zero_df.index)
xyz_zero_df = dataset.query('x < 0.01 or y < 0.01 or z < 0.01')
xyz_zero_df
Out[5]:
3.2 处理类别型字段
3.2.1 统计类别型字段
In [6]:
# take care of categorical data
cols = dataset.columns
num_cols = dataset._get_numeric_data().columns
cat_cols = set(cols) - set(num_cols)
print('类别型字段是:' + str(cat_cols))
由数据集字段说明可知,cut、clarity、color这3个字段都是类别型字段。对他们做字符编码和独热编码。
3.2.2 字符编码和独热编码
In [7]:
dataset = pd.get_dummies(dataset, drop_first=True)
dataset
Out[7]:
数据集由10列变为24列。
In [8]:
dataset.head()
Out[8]:
3.3 生成自变量和因变量
In [9]:
# 生成自变量和因变量
y = dataset['price'].values
dataset = dataset.drop(['price'], axis = 1)
X = dataset.values
In [10]:
X[:5, :]
Out[10]:
In [11]:
y[:5]
Out[11]:
3.4 拆分数据集
In [12]:
# 拆分数据集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
3.5 特征缩放
In [13]:
# 特征缩放
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
In [14]:
sc_y = StandardScaler()
y_train = np.ravel(sc_y.fit_transform(y_train.reshape(-1, 1)))
y_test = np.ravel(sc_y.transform(y_test.reshape(-1, 1)))
4. 构建不同的模型并调用k折交叉验证
4.1 构建随机森林模型并调用k折交叉验证
In [15]:
# 随机森林回归模型
from sklearn.ensemble import RandomForestRegressor
rf_regressor = RandomForestRegressor(n_estimators = 500, random_state = 0, verbose = 1)
下面的代码,在4核8GB机器上,大约训练 2~3 分钟。
In [16]:
# 应用K折交叉验证(K=5)
from sklearn.model_selection import cross_val_score
rf_mse = cross_val_score(estimator = rf_regressor, X = X_train, y = y_train, scoring = 'r2', cv = 5, verbose = 1, n_jobs=6)
4.2 构建多元线性回归模型并调用k折交叉验证
In [17]:
# 多元线性回归模型
from sklearn.linear_model import LinearRegression
ml_regressor = LinearRegression()
下面的代码,在4核8GB机器上,大约训练 1 秒钟。
In [18]:
# 应用K折交叉验证(K=5)
from sklearn.model_selection import cross_val_score
ml_mse = cross_val_score(estimator = ml_regressor, X = X_train, y = y_train, scoring = 'r2', cv = 5, verbose = 1, n_jobs=6)
4.3 构建SVM模型并调用k折交叉验证
In [19]:
# 支持向量机模型
from sklearn.svm import SVR
svr_regressor = SVR(kernel = 'rbf', verbose = 1)
下面的代码,在4核8GB机器上,大约训练 1 分钟。
In [20]:
# 应用K折交叉验证(K=5)
from sklearn.model_selection import cross_val_score
svr_mse = cross_val_score(estimator = svr_regressor, X = X_train, y = y_train, scoring = 'r2', cv = 5, verbose = 1, n_jobs=6)
5. 比较3个模型的性能
In [21]:
# 比较3个模型性能
print('随机森林模型中,R2的平均数是 %.4f,标准差是 %.4f' %(rf_mse.mean(), rf_mse.std()))
In [22]:
print('多元线性回归模型中,R2的平均数是 %.4f,标准差是 %.4f' %(ml_mse.mean(), ml_mse.std()))
In [23]:
print('支持向量机模型中,R2的平均数是 %.4f,标准差是 %.4f' %(svr_mse.mean(), svr_mse.std()))
结论:
- 支持向量机模型R2的平均数最高(低偏差),标准差最小(低方差),说明 支持向量机 是最优模型。
分类:
数据科学 / 机器学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具