最小二乘法

基本概念

线性回归模型

对于不同的数据集,数据挖掘或者说机器学习的过程,就是建立数据模型的过程。对于回归类问题,线性模型预测的一般公式如下:

y=w[0]x[0]+w[1]x[1]+w[2]x[2]+……+w[p]x[p]+b

这里x[0]到x[p]表示耽搁数据点的特征(本例中特征个数为p+1),w和b是学习模型的参数,y是预测结果,对于单一特征的数据集,公式如下:

*y=w[0]x[0]+b

大家可以看出来,这个很像高中数学里的直线方程。其中w[0]就是斜率,对于有更多特征的数据集,w包含沿每个特征坐标元素的斜率。或者,你也可以将预测的响应值看作输入特征的加权求和,权重由w的元素给出。

算法简介

最小二乘算法

普通最小二乘算法,或者说线性回归,是回归问题最简单也是最经典的线性方法,线性回归寻找参数w和b,使得对训练集的预测值与真实的回归目标值y之间的均方误差最小。
均方误差是预测值与真实值之差的平方和除以样本数。

数据来源

第一人称fps游戏csgo的等分数据:https://www.kaggle.com/sp1nalcord/mycsgo-data

在这里插入图片描述

csgo是一款第一人称的射击游戏,该数据包括每位玩家的网络延迟(ping),击杀数量,死亡数量,得分情况等等。
嘿嘿,游戏这方面我还是比较了解的,这也是博主唯一一个不用看原版数据的英文介绍,就能看懂各个维度的数据集了。

数据挖掘

1.导入第三方库

1
2
3
4
5
6
import pandas as pd
import numpy as np
import winreg
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression#导入线性回归算法
from sklearn.metrics import r2_score

老规矩,上来先依次导入建模需要的各个模块

2.读取文件

1
2
3
4
5
6
import winreg
real_address = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',)
file_address=winreg.QueryValueEx(real_address, "Desktop")[0]
file_address+='\\'
file_origin=file_address+"\\源数据-分析\\avocado.csv"#设立源数据文件的桌面绝对路径
csgo=pd.read_csv(file_origin)#https://www.kaggle.com/neuromusic/avocado-prices

因为之前每次下载数据之后都要将文件转移到python根目录里面,或者到下载文件夹里面去读取,很麻烦。所以我通过winreg库,来设立绝对桌面路径,这样只要把数据下载到桌面上,或者粘到桌面上的特定文件夹里面去读取就好了,不会跟其它数据搞混。
其实到这一步都是在走流程,基本上每个数据挖掘都要来一遍,没什么好说的。

3.清洗数据

在这里插入图片描述

可以看到这个数据并不包括缺失值,而且各个特征值之间也没有属性重叠的状况,所以暂时不需要任何处理。

4.建模

1
X_train,X_test,y_train,y_test=train_test_split(csgo[["Ping","Kills","Assists","Deaths","MVP","HSP"]],csgo["Score"],random_state=1)

将score划分为预测值,其它的属性划分为特征值,并将数据划分成训练集和测试集。

1
2
3
4
LR=LinearRegression()
LR.fit(X_train,y_train)
prediction=LR.predict(X_test)
r2_score(y_test,prediction)

引入算法,进行建模后,对测试集进行精度评分,得到的结果如下:

在这里插入图片描述

可以看到,该模型的精度为94%左右。
至此,这个数据集的将建模就算是完成了。

5.总结

1.可以感受到最小二乘法算法并没有什么难点,但是它确是最经典,最重要的算法之一。因为有很多的其它线性回归算法都是基于它的模型公式推导出来的,所以对于这个模型的公式一定要理解。
对算法的原理一定要有自己的理解,或许并不会专门从事算法研发的工作,但是对于算法如何去使用,用在什么场景是一定要知道的。

2.大家可以看到这个算法并不需要调参,因为这个算法并没有参数可言,这是一个优点,但是这也反映了一件事,就是没有办法控制模型的复杂度,也没有办法通过调整算法本身,来去提高模型精度。

有很多地方做的不是很好,欢迎网友来提出建议,也希望可以遇到些朋友来一起交流讨论。