笔记资源:(1条消息) 机器学习入门专栏笔记对应jupyternotebook以及封装的各种算法个人笔记,如有错误,感谢指出!-机器学习文档类资源-CSDN文库
特点:
解决回归问题
思想简单,容易实现
许多强大的非线性模型的基础
结果具有很好的可解释性
蕴含机器学习中的很多重要思想
概括:
寻找一条直线,最大程度的拟合样本特征和样本输出标记之间的关系
![](https://i-blog.csdnimg.cn/blog_migrate/a6233f2165c298eadcc4ee3801d89f2d.png)
分类问题与回归问题:
上图的分类问题横纵坐标分别表示一个特征,回归问题只有横坐标表示一个特征,如果表示俩个特征就变成了三维模型。
样本特征只有一个的回归称为简单线性回归。多个叫多元线性回归。
在这个模型当中,我们并没有运用神经网络的方式训练参数a和b,而是将这俩个参数以数学的形式表示出来,再输入程序中,直接对数据进行处理,进而得出我们的线性回归模型。因此要区别于深度学习的过程。此模型的建立过程并没有使用迭代!
一,简单线性回归
![](https://i-blog.csdnimg.cn/blog_migrate/a33b342f5888e5d714665544b1aefb32.png)
![](https://i-blog.csdnimg.cn/blog_migrate/43f090d26fa8b6922077d9edadded0fe.png)
其中排除第一个是因为有正负号会抵消
排除第二个是因为绝对值并不是一个处处可导的函数,造成后续操作困难
因此选用平方的方式。
![](https://i-blog.csdnimg.cn/blog_migrate/3a16ddaf94f204f08b015ea9724a456b.png)
监督学习,x(i), y(i)是已知数
类似上边这个函数称为损失函数(loss function)或效用函数(utilityfunction)。
机器学习首先通过分析问题来确定问题的损失函数或效用安徽念书,通过最优化损失函数或者效用函数,来获得机器学习的模型
损失函数尽可能小,效用函数尽可能大
几乎所有的参数学习算法都是这样的套路,比如线性回归,SVM,多项式回归,神经网络,逻辑回归等,区别是模型不同,建立的目标函数不同,优化的方式也不同,因此产生了一门学科:最优化原理,包含凸优化
简单线性回归典型的最小二乘法问题:最小化误差的平方
参数a和b可以表示为:
![](https://i-blog.csdnimg.cn/blog_migrate/b63412f32a4163ed8f3fb0e3a9750ed9.png)
二,简单线性回归的实现 Simple Linear Regression
简单实现与测试:
![](https://i-blog.csdnimg.cn/blog_migrate/7ec5b58a55c829da73b185366d84e2c3.png)
简单归一化算法的封装:
![](https://i-blog.csdnimg.cn/blog_migrate/6e25df98218529884551e08b5e9ddd0b.png)
三,衡量线性回归算法的指标:MSE,RMSE和MAE
![](https://i-blog.csdnimg.cn/blog_migrate/75e1843c4f6cfd8d55292286aa95f408.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e9bf0c6ac2f9d81b4cfa197d125db225.png)
![](https://i-blog.csdnimg.cn/blog_migrate/23a9b3ba971f81d965540e82858a20f6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/73a983dcdc2ddda66e463599df76bf66.png)
其中,MSE的量纲与y不同,所以可以使用RMSE来统一量纲,这样可以很好的解释这个误差代表什么,即代表与样本中的y数据偏离的具体数值。
RMSE会放大预测结果与真实结果之间的差距,尤其是差距较大时候。而MAE并没有方法这种差异。因为没有平方的差距。
但是当我们需要训练参数的时候,我们可以利用减少RMSE来训练模型。
波士顿房产数据
import numpy as np
importmatplotlib.pyplot as plt
from sklearn importdatasets
boston =datasets.load_boston()
boston.keys() #查看数据库的关键字
print(boston.DESCR) #查看数据库的属性,包括样本数量和特征
boston.feature_names #查看特征名称,按顺序列出
x = boston.data[:,5] #只使用房间数量这个特征,特征对应列
y = boston.target
plt.scatter(x, y)
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/757167e84d27047b43c2312f90269e36.png)
有些数据超过了问卷限度所以最大值是50没有意义的数据,要过滤
x = x[y < 50.0]
y = y[y < 50.0]
![](https://i-blog.csdnimg.cn/blog_migrate/686a6d6c3b90bf22b5b4309dbbfd80fa.png)
plt.scatter(x_train,y_train) #训练样本点
plt.scatter(x_test,y_test, color="c") #测试样本点
plt.plot(x_train,reg.predict(x_train), color='r') #训练后的预测数据线
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/55cb274676574629357345fc0b24be92.png)
sklearn中的MSE和MAE
from sklearn.metricsimport mean_squared_error
from sklearn.metricsimport mean_absolute_error
mean_squared_error(y_test,y_predict)
mean_absolute_error(y_test,y_predict)
四,衡量线性回归最好的指标:R Squared
分类问题的准确度:1最好,0最差
对于预测问题需要有更好的标准
比如我们用这个线性回归模型分别预测波士顿房价和学生成绩,那么这是俩个不同量级的数据,对应MSE这些指标也都是量级上的差异,我们就没办法判断模型更适合预测哪种类型的数据。R Squared可以解决这一问题
![](https://i-blog.csdnimg.cn/blog_migrate/14f75571ffba9989d81942161e7aa913.png)
分子是使用模型预测产生的错误,分母表示使用y等于y(mean)预测产生的错误
![](https://i-blog.csdnimg.cn/blog_migrate/7fa861d1e883c90e9fc20610ff563246.png)
scikit-learn中的 r2_score
from sklearn.metricsimport r2_score
r2_score(y_test,y_predict)
五,多元线性回归
![](https://i-blog.csdnimg.cn/blog_migrate/2ac1d0ec4f279346cd474968162172d7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1a2eceb1924de147511480b9a7b52550.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bfa82681b04d671cc2f19eb49b887578.png)
多元线性回归的正规方程解(normal equation)
![](https://i-blog.csdnimg.cn/blog_migrate/21180e12c221a1861b377f5ffeae5bea.png)
问题:时间复杂度高:O(n^3)->O(n^2.4)(简单优化后的时间复杂度还是很高)
优点:不需要对数据做归一化处理(对比KNN需要做预处理统一量纲)
多元线性回归程序封装:
![](https://i-blog.csdnimg.cn/blog_migrate/95931516ba62b2f779a8ec73930f74a0.png)
scikit-learn解决回归问题
fromsklearn.linear_model import LinearRegression
lin_reg =LinearRegression()
lin_reg.fit(X_train,y_train)
lin_reg.coef_ #查看系数,系数正负表示±相关,具有一定的可解释性
lin_reg.intercept_ #查看截距
lin_reg.score(X_test,y_test)
![](https://i-blog.csdnimg.cn/blog_migrate/2846b29c5494dcc8332378f465a63dc7.png)
KNN Regressor 利用KNN解决回归问题
调用的包不同
from sklearn.neighborsimport KNeighborsRegressor
knn_reg =KNeighborsRegressor()
knn_reg.fit(X_train_standard,y_train)
knn_reg.score(X_test_standard,y_test)
网络搜索:
fromsklearn.model_selection import GridSearchCV
param_grid = [
{
"weights":["uniform"],
"n_neighbors": [i for i inrange(1, 11)]
},
{
"weights":["distance"],
"n_neighbors": [i for i inrange(1, 11)],
"p": [i for i in range(1,6)]
}
]
knn_reg =KNeighborsRegressor()
grid_search =GridSearchCV(knn_reg, param_grid, n_jobs=-1, verbose=1)
grid_search.fit(X_train_standard,y_train)
grid_search.best_params_
![](https://i-blog.csdnimg.cn/blog_migrate/37d6c3574897bf470f58b85efed8127e.png)
grid_search.best_score_
![](https://i-blog.csdnimg.cn/blog_migrate/e7581166e897635a0c9c24c8bb53ef2e.png)
比之前线性回归的结果差,原因是采取不同的评分方式,网络搜索CV采取交叉验证
grid_search.best_estimator_.score(X_test_standard,y_test)
![](https://i-blog.csdnimg.cn/blog_migrate/c3cf458001ab9fbea32d3ae45b43fb5d.png)
当然也不一定比线性回归好,所以还不能仅仅通过score判断俩种算法好坏
六,更多线性回归的讨论
线性回归算法:
典型的参数学习
对比KNN:非参数学习
只能解决回归问题
优点:具有一定的可解释性
虽然很多分类方法中,线性回归是基础,比如逻辑回归
对比KNN:既可以解决分类问题,又可以解决预测问题
对数据有假设:假设数据是线性相关,但不一定只能解决线性问题
对比KNN没有假设
![](https://i-blog.csdnimg.cn/blog_migrate/6a7ef9d860ead012514f9daa7b7c7275.png)