您的位置:首页 > 编程语言 > Python开发

<机器学习笔记-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']
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息