<机器学习笔记-02> (scikit-learn 02)线性回归
摘要:本文是“Mastering Machine Learning With scikit-learn”第二章“线性回归”的学习笔记,对书中源码进行实现,并对书中内容按照知识模块进行整理,尤其是对python函数整理力求做到清晰有条理;
注1:笔记中重在功能实现,对于基本理论理解不深,以后还是需要加强的。
注2:本文第一次使用Pypora软件写成md文件,然后上传到MarkDown页面,在序号排版方面比CSDN自带的要好些,但是快捷键不如CSDN博客方便,而数学公式和图片上传还都不太熟悉;
-
知识要点总结:
-
基本概念:
-
掌握模型:一元/多元线性回归模型,一元多项式回归模型;
-
理解概念:损失函数、残差;
-
理解回归拟合模型参数估计,尤其是最小二乘法;理解正则化的常用方法(岭回归法,LASSO法,弹性网);
-
理解预测结果的方法,尤其是R-Square;
-
理解梯度下降法;
-
-
Python基本功能:
-
读入库/库中的某个函数,或为其取别名;
-
掌握terminal输入多行命令的方法;
-
使用def定义函数
-
使用print函数输出文本和数字;
-
掌握for循环使用
-
掌握用enumerate()获取列表的索引和数值
-
会用shape()和reshape()对Array的形状进行操作;
-
掌握list的索引号调用方法;
-
-
Matplotlib库
-
打开Inline显示图片功能;
-
定义显示图片的文字(大小+字体)、题目、坐标轴(名称+范围)、打开网格;
-
绘制不同颜色的点、线;
-
绘制散点分布图;
-
-
Numpy库
-
会求均值、方差、协方差;
-
会求矩阵的dot,inv,transpose();
-
使用lstsq()求最小二乘法;
-
-
Sklearn库
-
会基于linear_model.LinearRegression建立一元/多元线性回归模型;会基于LinearRegression和preprocessing.PolynomialFeatures建立一元多次线性回归模型;会基于linear_model.SGDRegressor建立随机梯度下降SGD模型;
-
使用model.fit()建模,使用model.predict()预测,使用model.score()求测试集的R-Square;
-
基于cross_validation,会用train_test_split()函数划分训练集和测试集,会用cross_val_score()计算交叉检验的R-Squre结果;
-
-
-
基本概念与理论分析
-
损失函数(loss function):用来定义模型与观测值的误差;
-
残差(residuals):模型预测的数值与训练集数据的差异,也叫训练误差(training erros);
-
LinearRegression类
学习方法下的fit()
-
一元线性回归模型为: y=a+bx ;
-
多元线性回归模型为: y=a+b1x1+b2x2+...+bnxn
-
-
回归拟合模型的参数估计常用方法是普通最小二乘法;对于一元线性回归的最小二乘法,相关系数 b <script type="math/tex" id="MathJax-Element-6">b</script> 可以通过方差和协方差求得;
-
R方(R-Square):确定系数(coefficent of determination),表示模型对现实数据拟合的程度;可以通过样本总体平方和以及残差平方和可以求得;
-
多元线性回归 & 多项式回归
-
正则化方法
-
岭回归(Ridge Regression,RR):增加L2范数项(相关系数向量平方和的平方根)来调整成本函数(残差平方和)
-
最小收缩和选择算子(LASSO),增加L1范数项(相关系数向量之和)来调整成本函数;
-
弹性网(elastic net)正则化方法:线性组合L1和L2范数项;
-
-
梯度下降法拟合:
-
每一次运算时,计算对应位置的导数,然后沿着梯度(变化最快的方向)相反的方向前进,总是垂直于等高线;
-
梯度下降法求出的是成本函数的局部最小值;一个三维凸(convex)函数所有点构成的图形像一个碗;残差平方和构成的成本函数是凸函数,所以可以找到全局最小值;
-
重要超参数是步长(learning rate),用来控制下降幅度;
-
分类:批量梯度下降(每次迭代用所有训练样本),随机梯度下降(SGD,每次迭代用随机选择的训练样本)
-
-
-
编程积累
-
本笔记使用PyQt(qtconsole)IDE;
-
基本用法
-
缩进代表逻辑层次,代替C++中的大括号{};
-
注释:单行使用#,多行使用”“” “”“;
-
terminal情况下输入多行命令:要使用\;注意
plt1=runplt(); \ X=[[],[],[],[],[]] ;\ Y=[[],[],[],[],[]]; \ plt1.plot(X,Y,'k.'); \ plt1.show()
-
定义函数def
def runplt(): plt.figure() return plt
-
打印命令
,以及字符串%使用(一个是取余数,一个是将数字转化为字符串); .2f表示字符串格式为print()
print ('预测一张13寸披萨的价格:$%.2f'%model.predict([])[])
-
-string,%s
-整数ints%d
"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike". "My name is %s and i'm %d" % ('john', ) #My name is john and i'm 12
-
使用
循环,得到数组的序号enumerate()
(放在前面的)和数值idx
(放在后面的);val
for idx, val in enumerate(ints): print(idx, val)
-
将区间进行划分linspace()
xx = np.linspace(, , ) xx #输出: array([ 0. , 6.5, 13. , 19.5, 26. ])
-
Y的shape如果是(n,m),array.shape[0]返回n;reshape()将对array的形状进行改变;
In []: Y = np.arange().reshape(,) In []: Y Out[]: array([[ , , , ], [ , , , ], [ , , , ]]) In []: Y.shape Out[]: (, ) In []: Y.shape[] Out[]:
-
list索引号
>>> a = [,,,,,] >>> a[:-] #输出[1, 2, 3, 4, 5] >>> a[:] #输出[2] >>> a[:] #输出[2, 3, 4, 5, 6] >>> a[:] #输出[1, 2, 3, 4, 5, 6]
-
-
matplotlib画图工具集合
-
开启plot inline模式:绘制的图将像其他计算结果一样,直接显示在terminal上面;
%matplotlib inline
-
读入工具包matplotlib;import library as lib
-
字体定义:两种字体定义的方法
#方法1 from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=) #方法2 font2={'fontname':'Helvetica'} matplotlib.pyplot.title('匹萨价格与直径数据',font2)#标题(名称+字体)定义
-
2-D绘图、标题、坐标轴定义(名称+范围)、显示网格
matplotlib.pyplot.figure()#新建绘图板 matplotlib.pyplot.title('匹萨价格与直径数据',fontproperties=font)#标题(名称+字体)定义 matplotlib.pyplot.xlabel('直径(英寸)',fontproperties=font)#X轴(名称+字体)定义 matplotlib.pyplot.ylabel('价格(美元)',font2)#Y轴(名称+字体)定义 matplotlib.pyplot.axis([, , , ]) #定义坐标轴的范围 matplotlib.pyplot.grid(True)#显示网格
-
绘制坐标点,显示绘图结果;注意绘图时输入的坐标应该为二维数组2-D Array
X = [[6], [8], [10], [14], [18]] y = [[7], [9], [13], [17.5], [18]] matplotlib.pyplot.plot(X, y, 'k.') matplotlib.pyplot.plot.show()
-
绘制类型:线色+类型(点或者线)
plt.plot(X, y, 'k.') #绘制黑色(k)点(.) plt.plot(X2, y2, 'g-') #绘制绿色(g)线(-) plt.plot(X2, y4, 'y-.')#绘制黄色(y)点划线(-.)
-
实际使用绘图工具时,可以先定义一个基本的函数模板,里面包括标题、坐标轴定义、字体等基本设置,然后再调用该模板,在该模板上进行适当地修改即可;
-
绘制散点分布图scatter(,)
plt.scatter(df['alcohol'], df['quality'])
-
-
Numpy命令积累
-
调用Numpy库
-
mean()求均值
print('残差平均值: %.2f' % np.mean((model.predict(X) - y) ** ))
-
var()求方差
-
cov()求协方差
print(np.cov([6, 8, 10, 14, 18], [7, 9, 13, 17.5, 18])[0][1]) #numpy.cov()计算协方差
-
矩阵计算-求逆inv,点乘dot,转置transpose
from numpy.linalg import inv from numpy import dot, transpose X = [[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0]] y = [[7], [9], [13], [17.5], [18]] print(dot(inv(dot(transpose(X), X)), dot(transpose(X), y)))
-
最小二乘法
lstsq()
from numpy.linalg import lstsqprint(lstsq(X, y)[])
-
-
Sklearn命令积累
-
调入线性回归函数LinearRegression;
from sklearn.linear_model import LinearRegression
-
fit()建立一元线性回归模型
X = [[8], [9], [11], [16], [12]] y = [[11], [8.5], [15], [18], [11]] model = LinearRegression() model.fit(X, y)#建立一元线性回归模型
-
fit()建立多元线性回归模型
X = [[6, 2], [8, 1], [10, 0], [14, 2], [18, 0]] y = [[7], [9], [13], [17.5], [18]] model = LinearRegression() model.fit(X, y) #建立二元线性回归模型
-
predict()通过fit()算出的模型参数构成的模型,对解释变量进行预测获得的值;
print('预测一张12英寸匹萨价格:$%.2f' % model.predict([])[]) #单值预测 X_test = [[8, 2], [9, 0], [11, 2], [16, 2], [12, 0]] predictions = model.predict(X_test)#一组数进行预测
-
mode.score计算R方R-Square
-
建立一元多项式回归模型
from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures X_train = [[6], [8], [10], [14], [18]] y_train = [[7], [9], [13], [17.5], [18]] #需要输入列向量,而不是行向量 X_test = [[6], [8], [11], [16]]#测试数据准备 y_test = [[8], [12], [15], [18]] quadratic_featurizer = PolynomialFeatures(degree=) #定义多项式的最高阶数 X_train_quadratic = quadratic_featurizer.fit_transform(X_train) #为fit()建模准备输入 regressor_quadratic = LinearRegression() regressor_quadratic.fit(X_train_quadratic, y_train)# fit()函数建模 X_test_quadratic = quadratic_featurizer.transform(X_test) #为预测准备输入量 y_test_quadratic=regressor_quadratic.predict(xx_quadratic) #使用模型预测数据 print('一元线性回归 r-squared', regressor.score(X_test, y_test)) #计算R-Square
-
train_test_split()按数据集分成训练集和测试集;分区比例可以设置,默认25%分给测试集;
from sklearn.cross_validation import train_test_split df = pd.read_csv('mlslpic/winequality-red.csv', sep=';') X = df[list(df.columns)[:-]] y = df['quality'] X_train, X_test, y_train, y_test = train_test_split(X, y)
-
cross_val_score()可以返回交叉检验的score结果;
from sklearn.cross_validation import cross_val_score regressor = LinearRegression() scores = cross_val_score(regressor, X, y, cv=) print(scores.mean(), scores
-
加载scikit-learn数据集
from sklearn.datasets import load_boston
-
加载SGDRegressor,归一化StandardScaler,建立模型以及求R-Square
from sklearn.linear_model import SGDRegressor from sklearn.preprocessing import StandardScaler X_scaler = StandardScaler() y_scaler = StandardScaler() X_train = X_scaler.fit_transform(X_train) y_train = y_scaler.fit_transform(y_train) X_test = X_scaler.transform(X_test) y_test = y_scaler.transform(y_test) regressor = SGDRegressor(loss='squared_loss') regressor.fit_transform(X_train, y_train) #建立模型 print('测试集R方值:', regressor.score(X_test, y_test))
-
-
pandas库
-
读入pandas库;可以处理二维表
-
读入csv文件,read_csv
分隔符sep
df=pd.read_csv('C:/add.csv',sep=';')
-
显示数据的前几行、前几列head()
df.head()
-
显示统计结果describe()
df.describe()
-
显示统计结果[' ']
df['alcohol']
-
-