机器学习 回归模型的建立与预测
基于岭回归选取特征集以及基于SVR构建回归模型
关于数据集:某一地区十年的风速数据,基于SVR构建风速预测模型
1、导入所需的模块
import pandas as pd
from sklearn.feature_selection import RFE
from sklearn.linear_model import Ridge#岭回归进行特征选择
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error
2、读取数据,选取特征集和目标向量
data = pd.read_excel("./data.xlsx")
# 特征集
data_list = ['cloud_cover', 'humidity', 'global_radiation', 'precipitation', 'sunshine', 'temp_mean', 'temp_min', 'temp_max']
# X为特征集,y为目标向量
X = data[data_list]
y = data['wind_speed']
3、选取特征集
递归特征消除(Recursive Feature Elimination):这是一种基于模型的特征选择方法,它通过递归地训练模型,并在每一轮中剔除最不重要的特征,直到达到预定的特征数量为止。在这个过程中,可以根据模型的性能评估特征的重要性。
基于岭回归选取最重要的前2个特征集。
# 使用岭回归模型作为基础模型
model = Ridge()
# 创建RFE对象,指定基础模型和要保留的特征数量
rfe = RFE(model, n_features_to_select=2)
# 使用RFE进行特征选择
X_rfe = rfe.fit_transform(X, y)
# 获取选择的特征索引
selected_features_index = rfe.support_
# 输出选择的特征名字
selected_feature_names = [data_list[i] for i, selected in enumerate(selected_features_index) if selected]
##'humidity', 'global_radiation'
4、数据可视化一:特征集与目标向量的相关性
#选择的特征集与目标向量的关系
sns.pairplot(data
, x_vars=selected_feature_names
, y_vars='wind_speed'
, size=7
, aspect=0.8
, kind='reg')
plt.show()
5、构建SVR回归模型,进行参数调优,选取最优参数。
#构建回归模型
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_rfe, y, random_state=1,test_size=0.25)
# 定义SVR模型
svr = SVR()
# 设置参数网格
param_grid = {
'kernel': ['linear', 'poly', 'rbf'],
'C': [0.1, 1, 10],
'gamma': ['scale', 'auto'],
'epsilon': [0.1, 0.2, 0.5]
}
# 创建GridSearchCV对象
grid_search = GridSearchCV(svr, param_grid, cv=5, scoring='neg_mean_squared_error')
# 在训练集上拟合GridSearchCV对象
grid_search.fit(X_train, y_train)
# 获取最佳参数组合
best_params = grid_search.best_params_
print("Best Parameters:", best_params)
# best_params = {'C': 10, 'epsilon': 0.5, 'gamma': 'scale', 'kernel': 'rbf'}
6、根据最优参数,构建最终模型。
# 使用最佳参数构建最终的SVR模型
best_svr = SVR(kernel=best_params['kernel'], C=best_params['C'], gamma=best_params['gamma'], epsilon=best_params['epsilon'])
best_svr.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = best_svr.predict(X_test)
# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)
# Mean Squared Error: 2.1474928766471284
plt.figure(figsize=(20, 6)) # 设置图形的宽度为8英寸,高度为4英寸
plt.plot(range(300),y_pred[:300],'b',label="predict")
plt.plot(range(300),y_test[:300],'r',label="test")
plt.legend(loc="upper right")
plt.xlabel("number")
plt.ylabel('value')
plt.show()