机器学习—模型选择与优化7-2(网格搜索优化)
使用网格搜索优化钻石价格模型
主要步骤流程:
- 1. 导入包
- 2. 导入数据集
- 3. 数据预处理
- 3.1 处理缺失数据
- 3.2 处理类别型字段
- 3.2.1 统计类别型字段
- 3.2.2 字符编码和独热编码
- 3.3 生成自变量和因变量
- 3.4 拆分数据集
- 3.5 特征缩放
- 4. 构建最优模型
- 5. 应用网格搜索优化模型
- 6. 比较模型优化前和优化后的性能
- 6.1 优化前
- 6.2 优化后
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]:
# 统计缺失数据
df_null = dataset.isnull().sum()
df_null
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)
In [6]:
xyz_zero_df = dataset.query('x < 0.01 or y < 0.01 or z < 0.01')
xyz_zero_df
Out[6]:
3.2 处理类别型字段
3.2.1 统计类别型字段
In [7]:
# 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 [8]:
dataset = pd.get_dummies(dataset, drop_first=True)
dataset.shape
Out[8]:
数据集由10列变为24列。
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
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)
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折交叉验证法,从3个模型(随机森林、多元线性回归、支持向量机)中选择出了支持向量机模型。
In [15]:
# 构建支持向量机模型
from sklearn.svm import SVR
svr_regressor = SVR(kernel = 'rbf', C=1.0, verbose = 1)
5. 应用网格搜索优化模型
为了使案例简单化,gamma、epsilon等超参数暂不考虑。只考虑 C 和 kernel。
In [16]:
# 应用网格搜索算法找到最好的超参数
from sklearn.model_selection import GridSearchCV
parameters = [{'C': [0.5, 1, 1.5, 2], 'kernel': ['linear', 'rbf']}]
grid_search = GridSearchCV(estimator = svr_regressor,
param_grid = parameters,
scoring = 'r2',
cv = 5,
verbose=1,
n_jobs=6)
在4核8GB机器上,大约训练 40~50 分钟。
In [17]:
# 开始执行
grid_search.fit(X_train, y_train)
Out[17]:
In [18]:
best_score = grid_search.best_score_
best_score
Out[18]:
In [19]:
best_parameters = grid_search.best_params_
best_parameters
Out[19]:
最好的参数组合是:{'C': 2, 'kernel': 'rbf'}
6. 比较模型优化前和优化后的性能
6.1 优化前
In [20]:
# 优化前
from sklearn.svm import SVR
before_svr_regressor = SVR(kernel = 'rbf', C=1.0, verbose = 1)
before_svr_regressor.fit(X_train, y_train)
before_y_pred = before_svr_regressor.predict(X_test)
In [21]:
from sklearn.metrics import r2_score
before_r2_score = r2_score(y_test, before_y_pred)
In [22]:
before_r2_score
Out[22]:
6.2 优化后
In [23]:
# 优化后
after_svr_regressor = SVR(kernel = 'rbf', C=2.0, verbose = 1)
after_svr_regressor.fit(X_train, y_train)
after_y_pred = after_svr_regressor.predict(X_test)
In [24]:
after_r2_score = r2_score(y_test, after_y_pred)
In [25]:
after_r2_score
Out[25]:
结论:
- 优化后性能有所提升。
分类:
数据科学 / 机器学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具