<机器学习笔记-02> <scikit-learn -02>线性回归
2016-09-06 22:23
477 查看
<机器学习笔记-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 可以通过方差和协方差求得;
R方(R-Square):确定系数(coefficent of determination),表示模型对现实数据拟合的程度;可以通过样本总体平方和以及残差平方和可以求得;
多元线性回归 & 多项式回归
正则化方法
岭回归(Ridge Regression,RR):增加L2范数项(相关系数向量平方和的平方根)来调整成本函数(残差平方和)
最小收缩和选择算子(LASSO),增加L1范数项(相关系数向量之和)来调整成本函数;
弹性网(elastic net)正则化方法:线性组合L1和L2范数项;
梯度下降法拟合:
每一次运算时,计算对应位置的导数,然后沿着梯度(变化最快的方向)相反的方向前进,总是垂直于等高线;
梯度下降法求出的是成本函数的局部最小值;一个三维凸(convex)函数所有点构成的图形像一个碗;残差平方和构成的成本函数是凸函数,所以可以找到全局最小值;
重要超参数是[b]步长(learning rate),用来控制下降幅度;[/b]
分类:批量梯度下降(每次迭代用所有训练样本),随机梯度下降(SGD,每次迭代用随机选择的训练样本)
编程积累
本笔记使用PyQt(qtconsole)IDE;基本用法
缩进代表逻辑层次,代替C++中的大括号{};
注释:单行使用#,多行使用”“” “”“;
terminal情况下输入多行命令:要使用\;注意
plt1=runplt(); \ X=[[6],[8],[10],[14],[18]] ;\ Y=[[7],[9],[13],[17.5],[18]]; \ plt1.plot(X,Y,'k.'); \ plt1.show()
定义函数def
def runplt(): plt.figure() return plt
打印命令
print(),以及字符串%使用(一个是取余数,一个是将数字转化为字符串); .2f表示字符串格式为
print ('预测一张13寸披萨的价格:$%.2f'%model.predict([13])[0])
%s-string,
%d-整数ints
"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike". "My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12
使用
enumerate()循环,得到数组的序号
idx(放在前面的)和数值
val(放在后面的);
for idx, val in enumerate(ints): print(idx, val)
linspace()将区间进行划分
xx = np.linspace(0, 26, 100) xx #输出: array([ 0. , 6.5, 13. , 19.5, 26. ])
Y的shape如果是(n,m),array.shape[0]返回n;reshape()将对array的形状进行改变;
In [46]: Y = np.arange(12).reshape(3,4) In [47]: Y Out[47]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) In [48]: Y.shape Out[48]: (3, 4) In [49]: Y.shape[0] Out[49]: 3
list索引号
>>> a = [1,2,3,4,5,6] >>> a[:-1] #输出[1, 2, 3, 4, 5] >>> a[1:2] #输出[2] >>> a[1:] #输出[2, 3, 4, 5, 6] >>> a[1:] #输出[1, 2, 3, 4, 5, 6]
matplotlib画图工具集合
开启plot inline模式:绘制的图将像其他计算结果一样,直接显示在terminal上面;
%matplotlib inline
读入工具包matplotlib;import library as lib
import matplotlib.pyplot as plt
字体定义:两种字体定义的方法
#方法1 from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", s d1ee ize=10) #方法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([0, 25, 0, 25]) #定义坐标轴的范围 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库
import numpy as np
mean()求均值
print('残差平均值: %.2f' % np.mean((model.predict(X) - y) ** 2))
var()求方差
print(np.var([6, 8, 10, 14, 18], ddof=1)) #numpy.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)[0])
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([12])[0]) #单值预测 X_test = [[8, 2], [9, 0], [11, 2], [16, 2], [12, 0]] predictions = model.predict(X_test)#一组数进行预测
mode.score计算R方R-Square
model.score(X_test, y_test) #LinearRegression的score方法可以计算R方
建立一元多项式回归模型
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=2) #定义多项式的最高阶数 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)[:-1]] 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=5) 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库;可以处理二维表
import pandas as pd
read_csv读入csv文件,
sep分隔符
df=pd.read_csv('C:/add.csv',sep=';')
head()显示数据的前几行、前几列
df.head()
describe()显示统计结果
df.describe()
[' ']显示统计结果
df['alcohol']
相关文章推荐
- <机器学习笔记-04 ><scikit-learn 04>逻辑回归
- 4000 <机器学习笔记-05 ><scikit-learn 05>决策树 & 随机森林
- <机器学习笔记-07 ><scikit-learn 07>PCA主成分分析
- <机器学习笔记-06 ><scikit-learn 06>K-Means 聚类
- <机器学习笔记-01><scikit-learn 01>机器学习基础
- Python下的机器学习工具scikit-learn(学习笔记3--数据预处理)
- <机器学习>自用笔记
- Python scikit-learn机器学习工具包学习笔记:feature_selection模块
- Python scikit-learn机器学习工具包学习笔记:feature_selection模块
- scikit-learn:7. Computational Performance(计算效能<延迟和吞吐量>)
- <转>斯坦福机器学习公开课精品笔记9
- < 笔记 > HTML - 02 HTML 表单标签
- < 笔记 > Git - 02 Git 安装
- Python scikit-learn机器学习工具包学习笔记:cross_validation模块
- 机器学习精简教程之二——用scikit-learn求解一元线性回归问题
- [机器学习]Scikit-Learn模块学习笔记——数据集模块datasets
- Python下的机器学习工具scikit-learn(学习笔记4)
- <转>斯坦福机器学习公开课精品笔记7
- 《逆向工程核心原理》<02-13> PE文件格式 部分笔记