一、前言
在《机器学习论文复现实战---linear regression》中通过Pearson 相关性分析,去除了2个高相关性特征 "PN" 和 "AN" ,数据维度变为890*25。(数据集地址)
这里我们不做如何前期处理,直接就将数据放入 KNeighborsRegressor 模型中进行训练了。
二、模型训练过程
2.1 导入Python库
'''====================导入Python库===================='''
import pandas as pd #python科学计算库
import numpy as np #Python的一个开源数据分析处理库。#
import matplotlib.pyplot as plt #常用Python画图工具
from sklearn.neighbors import KNeighborsRegressor # 导入KNeighborsRegressor 模型
from sklearn.model_selection import train_test_split # 数据划分模块
from sklearn.preprocessing import StandardScaler # 标准化模块
from sklearn.metrics import mean_squared_error,r2_score #误差函数MSE,误差函数R^2,
2.2 导入数据
'''========================导入数据========================'''
data = pd.read_excel('D:/复现/trainset_loop6.xlsx') #读取xlsx格式数据
# date = pd.read_csv('D:/复现/trainset_loop6.csv') #读取csv格式数据
print(data.isnull().sum()) #检查数据中是否存在缺失值
print(data.shape) #检查维度
print(data.columns) #数据的标签
data = data.drop(["PN","AN"], axis = 1) #axis = 1表示对列进行处理,0表示对行
Y, X = data['Eads'] , data.drop(['Eads'] , axis = 1) #对Y、X分别赋值
2.3 标准化
'''=========================标准化========================'''
#利用StandardScaler函数对X进行标准化处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
'''====================划分训练集与测试集==================='''
X_train,X_test,y_train,y_test = train_test_split(X , Y , test_size=0.2 , random_state=42)
2.4 模型训练与预测
'''=======================模型训练与预测========================'''
X_i = []
MSE_train = []
MSE_test = []
R2_train = []
R2_test = []
for i in range(1,10): # 找到最好的模型 n_neighbors = x后, 则 for i in range(x,x+1)。
#模型训练
model = KNeighborsRegressor( n_neighbors = i) # 模型实例化。
model.fit(X_train, y_train)
#模型预测
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)
#评估
mse_train=mean_squared_error(y_train,y_pred_train) #均方误差越小模型越好
mse_test=mean_squared_error(y_test,y_pred_test) #R2 表示模型对因变量的解释能力,取值范围从 0 ~ 1,越接近 1 表示模型对数据的拟合程度越好。
r2_train=r2_score(y_train,y_pred_train)
r2_test=r2_score(y_test,y_pred_test)
# print(f'MSE(Train):{mse_train:.2f}') #保留2位小数
# print(f'MSE(Test):{mse_test:.2f}')
# print(f'R^2(Train):{r2_train:.2f}')
# print(f'R^2(Test):{r2_test:.2f}')
X_i.append(i)
MSE_train.append( mse_train)
MSE_test.append(mse_test)
R2_train.append( r2_train)
R2_test.append( r2_test)
#将数据存入DataFrame表中9*5维度
df = pd.DataFrame(np.array([tuple(X_i),tuple(MSE_train),tuple(MSE_test),tuple(R2_train),tuple(R2_test)]).T,columns=['X', 'MSE_train', 'MSE_test',"R2_train","R2_test"])
# print(df)
2.5 模型调参
'''=========n_neighbors调参过程 MSE 和 R^2 变化图=========='''
#图画的可能不好看,可以自己慢慢修改代码,这里主要为了调参。
# 画第1个图:MSE_train 折线图
plt.subplot(221)
plt.plot(df['X'],df['MSE_train'])
plt.title('MSE_train',fontsize = 8, c='r')
# 画第2个图:MSE_test折线图
plt.subplot(222)
plt.plot(df['X'],df['MSE_test'])
plt.title('MSE_test',fontsize = 8, c='r')
# 画第3个图:R2_train折线图
plt.subplot(223)
plt.plot(df['X'],df['R2_train'])
plt.title('R2_train',fontsize = 8, c='r')
# 画第4个图:R2_test折线图
plt.subplot(224)
plt.plot(df['X'],df['R2_test'])
plt.title('R2_test',fontsize = 8, c='r')
# 将图保存为*.jpg图
plt.savefig('./KNN_调参.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()

最优参数为 n_neighbors = 5
MSE与结果:
MSE(Train):0.051
MSE(Test):0.068
R^2(Train):0.758
R^2(Test):0.631
2.6 可视化
'''======================结果可视化======================='''
plt.figure(figsize=(8,8))
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
colors = ['b', 'r'] # 设置颜色
markers = ["*","o"] # 设置点的形状
Y_train_picture = [y_train,y_test] #可视化图的x轴数据
Y_pred_picture = [y_pred_train,y_pred_test] #可视化图的y轴数据
for i in range(0,2):
plt.scatter(Y_train_picture[i],
Y_pred_picture[i],
s = 20, # 表示点的大小
c = colors[i], # 颜色
marker = markers[i], # 点的形状
edgecolors='b', # 散点边框颜色
alpha=0.6) # 透明度
plt.plot([-1.0,1.0],[-1.0,1.0],'r--') #可视化图数据范围
plt.xlabel('Actual') #x轴标签
plt.ylabel('Predicted') #y轴标签
plt.legend(['train', 'test'], loc='upper right',frameon=False) #图例,位置位于右上方,去掉图例边框
plt.title('Actual vs Predicted',fontsize=15, c='r')
# 将图保存为*.jpg图
plt.savefig('./KNN_可视化.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()

此图表示,数据点越靠近中间红线模型越好。
三、代码全部注释
'''====================导入Python库===================='''
import pandas as pd #python科学计算库
import numpy as np #Python的一个开源数据分析处理库。#
import matplotlib.pyplot as plt #常用Python画图工具
from sklearn.neighbors import KNeighborsRegressor # 导入 KNeighborsRegressor 模型
from sklearn.model_selection import train_test_split # 数据划分模块
from sklearn.preprocessing import StandardScaler # 标准化模块
from sklearn.metrics import mean_squared_error,r2_score #误差函数MSE,误差函数R^2,
'''========================导入数据========================'''
data = pd.read_excel('D:/复现/trainset_loop6.xlsx') #读取xlsx格式数据
# date = pd.read_csv('D:/复现/trainset_loop6.csv') #读取csv格式数据
print(data.isnull().sum()) #检查数据中是否存在缺失值
print(data.shape) #检查维度
print(data.columns) #数据的标签
data = data.drop(["PN","AN"], axis = 1) #axis = 1表示对列进行处理,0表示对行
Y, X = data['Eads'] , data.drop(['Eads'] , axis = 1) #对Y、X分别赋值
'''=========================标准化========================'''
#利用StandardScaler函数对X进行标准化处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
'''====================划分训练集与测试集==================='''
X_train,X_test,y_train,y_test = train_test_split(X , Y , test_size=0.2 , random_state=42)
'''=======================模型训练与预测========================'''
X_i = []
MSE_train = []
MSE_test = []
R2_train = []
R2_test = []
for i in range(5,6): # 找到最好的模型 n_neighbors = x后, 则 for i in range(x,x+1)。
#模型训练
model = KNeighborsRegressor( n_neighbors = i) # 模型实例化。
model.fit(X_train, y_train)
#模型预测
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)
#评估
mse_train=mean_squared_error(y_train,y_pred_train) #均方误差越小模型越好
mse_test=mean_squared_error(y_test,y_pred_test) #R2 表示模型对因变量的解释能力,取值范围从 0 ~ 1,越接近 1 表示模型对数据的拟合程度越好。
r2_train=r2_score(y_train,y_pred_train)
r2_test=r2_score(y_test,y_pred_test)
print(f'MSE(Train):{mse_train:.3f}') #保留2位小数
print(f'MSE(Test):{mse_test:.3f}')
print(f'R^2(Train):{r2_train:.3f}')
print(f'R^2(Test):{r2_test:.3f}')
X_i.append(i)
MSE_train.append( mse_train)
MSE_test.append(mse_test)
R2_train.append( r2_train)
R2_test.append( r2_test)
#将数据存入DataFrame表中9*5维度
df = pd.DataFrame(np.array([tuple(X_i),tuple(MSE_train),tuple(MSE_test),tuple(R2_train),tuple(R2_test)]).T,columns=['X', 'MSE_train', 'MSE_test',"R2_train","R2_test"])
# print(df)
'''=========n_neighbors调参过程 MSE 和 R^2 变化图=========='''
#图画的可能不好看,可以自己慢慢修改代码,这里主要为了调参。
# 画第1个图:MSE_train 折线图
plt.subplot(221)
plt.plot(df['X'],df['MSE_train'])
plt.title('MSE_train',fontsize = 8, c='r')
# 画第2个图:MSE_test折线图
plt.subplot(222)
plt.plot(df['X'],df['MSE_test'])
plt.title('MSE_test',fontsize = 8, c='r')
# 画第3个图:R2_train折线图
plt.subplot(223)
plt.plot(df['X'],df['R2_train'])
plt.title('R2_train',fontsize = 8, c='r')
# 画第4个图:R2_test折线图
plt.subplot(224)
plt.plot(df['X'],df['R2_test'])
plt.title('R2_test',fontsize = 8, c='r')
# 将图保存为*.jpg图
plt.savefig('./KNN_调参.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()
'''======================结果可视化======================='''
plt.figure(figsize=(8,8))
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
colors = ['b', 'r'] # 设置颜色
markers = ["*","o"] # 设置点的形状
Y_train_picture = [y_train,y_test] #可视化图的x轴数据
Y_pred_picture = [y_pred_train,y_pred_test] #可视化图的y轴数据
for i in range(0,2):
plt.scatter(Y_train_picture[i],
Y_pred_picture[i],
s = 20, # 表示点的大小
c = colors[i], # 颜色
marker = markers[i], # 点的形状
edgecolors='b', # 散点边框颜色
alpha=0.6) # 透明度
plt.plot([-1.0,1.0],[-1.0,1.0],'r--') #可视化图数据范围
plt.xlabel('Actual') #x轴标签
plt.ylabel('Predicted') #y轴标签
plt.legend(['train', 'test'], loc='upper right',frameon=False) #图例,位置位于右上方,去掉图例边框
plt.title('Actual vs Predicted',fontsize=15, c='r')
# 将图保存为*.jpg图
plt.savefig('./KNN_可视化.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()
优点
1. 简单易懂:KNN是一个非常直观且简单易实现的算法,适合初学者理解和使用。
2. 无参数模型:KNN不需要训练过程,只需要保存训练数据即可进行预测。
3. 适用于多分类问题:KNN可以很好地处理多分类问题,如鸢尾花数据集中的三个类别。
4. 灵活性强:通过调整K值可以控制模型的复杂度,容易进行调优。
缺点
1. 计算复杂度高:KNN需要计算待预测点与所有训练数据点的距离,数据集较大时计算量非常大。
2. 内存消耗大:KNN需要存储所有训练数据,内存消耗较大,尤其是对于大规模数据集。
3. 对特征尺度敏感:KNN对特征的尺度非常敏感,因此需要进行数据标准化处理。
4. 噪声敏感:KNN对噪声数据敏感,容易受离群点影响。
持续更新中。。。

--- 论文实战&spm=1001.2101.3001.5002&articleId=143365746&d=1&t=3&u=f957b114981c4610af0a528b6b1001f3)
419

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



