机器学习(二)

	监督学习是利用一组带有标签的数据,学习从输入到输出的映射,然后将这种映射关系应用到未知数据上,达到分类或回归的目的。输出的结果为离散时,学习任务为分类任务;结果为连续时,学习任务为回归任务。

一、分类和回归概述
分类学习
输入:一组有标签的训练数据(也称为观察和评估),标签表明了这些数据(观察)的所属类别。
输出:分类模型根据这些训练数据,训练自己的模型参数,学习出一个适合这组数据的分类器,当有新数据(非训练数据)需要进行类别判断,就可以将这组新数据作为输入送给学好的分类器进行判断。
分类学习-评价
训练集(training set):用来训练模型的已标注数据,用来建立模型,发现规律。
测试集(testin set):已标注数据,通常将标注隐藏,输送给训练好的模型,通过结果与真实标注进行对比,评估模型的学习能力。
训练集或测试集的划分方法:根据已有标注数据,随机选出一部分(70%)数据作为训练数据,余下的作为测试数据,此外还有交叉验证法,自助法用来评估分类模型。
分类学习-评价指标
1)精确率
针对预测结果,(以二分类为例)它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种是把正类预测为正类(TP),另外一种是把负类预测为正类(FP)。
P = TP/(TP + FP)
2)召回率
针对原来样本,表示的是样本中的正例有多少被预测正确了。有两种可能,一种是把原来的正类预测为正类(TP),另外一种是把原来的正类预测为负类(FN)。
R = TP/(TP +FN)
举例:
假设我们有60个正样本,40个负样本,我们要找出所有的正样本,分类算法查找出50个,其中只有40个是真正的正样本,TP:将正类预测为正类数40;FN:将正类预测为负类数20;FP:将负类预测为正类数10;TN:将负类预测为负类数30。计算准确率、精确率、召回率。
Sklearn提供的分类函数包括:k近邻(knn)、朴素贝叶斯(naivebayes)、
支持向量机(svm)、决策树(decision tree)、神经网络模型(Neural networks)等。其中有线性分类器,也有非线性分类器。
分类算法的应用:
金融(贷款是否批准进行评估);医疗诊断(判断一个肿瘤是恶性还是良性);欺诈检测(判断一笔银行的交易是否涉嫌欺诈);网页分类(判断网页的所属类别)。
回归分析:
了解两个或多个变数间是否相关、研究其相关方向与强度,并建立数学模型以便观察特定变数来预测研究者感兴趣的变数。回归分析可以帮助人们了解在自变量变化时因变量的变化量。
Sklearn提供的回归函数主要被封装在两个子模块中,分别是
sklearn.linear_model(封装的一些线性函数)和sklearn.preprocessin。
线性回归函数包括:普通线性回归函数(LinearRegression)、岭回归(Ridge)、Lasso(Lasso)。
多项式回归通过调用sklearn.preprossing子模块进行拟合。
回归应用:
回归方法适合对一些带有时序信息的数据进行预测或者趋势拟合,常用在金融及其他涉及时间序列分析的领域(股票趋势预测、交通流量预测)。
二、实例应用
1、人体运动状态预测——实例分析

数据介绍
我们现在收集了来自A,B,C,D,E,5位用户的可穿戴设备上的传感器数据,每位用户的数据集包含一个特征文件(a.feature)和一个标签文件(a.label)。
特征文件中每一行对应一个时刻的所有传感器数值,标签文件中每行记录了和特征文件中对应时刻的标记过的用户姿态,两个文件的行数相同,相同行之间互相对应。
数据介绍——feature
我们的特征文件共包含41列特征,数据内容。特征文件的各项特征包(1、时间戳,2心率,3-15(3温度数据,4-6一型三轴加速度数据,7-9二型三轴加速度数据、10-12三轴陀螺仪数据,13-15三轴磁场数据)、传感器1,16-18、传感器2,29-41、传感器3)
数据介绍-label
标签文件每一行代表与特征文件中对应行的用户姿态类别。总共有0-24共25种身体姿态,如,无活动状态、坐态、跑态等。标签文件作为训练集的标准参考准则,可以进行特征的监督学习。
任务介绍
假设现在出现了一个新用户,但我们只有传感器采集的数据,那么该如何得到这个新用户的姿态呢?又或者对同一用户如果传感器采集了新的数据,怎么样根据新的数据判断当前用户处于什么样的姿态呢?
在明确这是一个分类问题的情况下,我们可以选定某种分类模型(或者说是算法),通过使用训练数据进行模型学习,然后对每个测试样本给出对应的分类结果。
接下来介绍分类算法K近邻、决策树和朴素贝叶斯的原理和实现。
**K近邻分类器(KNN)**
通过计算待分类数据点,与已有数据集中的所有数据点的距离。取距离最小的前K个点,根据“少数服从多数”的原则,将这个数据点划分为出现次数最多的那个类别。
sklearn中的K近邻分类器
在sklearn库中,可以使用sklearn.neighbors.KNeighborsClassifier创建一个K近邻分类器,主要参数有:
n_neighbors:用于指定分类器中K的大小(默认值为5,注意与kmeans的区别)
weights:设置选中的K个点对分类结果影响的权重(默认值为平均权重“uniform”,可以选择“distance”代表越近的点权重越高,或者传入自己编写的以距离为参数的权重计算函数)。
algorithm:设置用于计算临近店的方法,因为当数据量很大的情况下当计算当前点和所有点的距离再选出最近的k个点,这种计算量是很费时的,所以选项中有ball_tree、kd_tree和brute,分别代表不同的寻找邻居的优化算法,默认值为auto,根据训练数据自动选择。
K近邻分类器的使用
创建一组数据X和它对应的标签y:
X = [[0],[1],[2],[3]]
y = [0,0,1,1]

使用import语句导入K近邻分类器

from sklearn.neighbors import KNeighborsClassifier

K近邻分类器的使用
参数n_neighbors设置为3,即使用最近的3个邻居作为分类的依据,其他参数保持默认值,并将创建好的实例赋给变量neigh。

neigh = KNeighborsClassifier(n_neighbors=3)

调用fit()函数,将训练数据X和标签y送入分类器进行学习。

neigh.fit(X,y)

调用predict()函数,对未知分类样本[1.1]分类,可以直接并将需要分类的数据构造为数组形式作为参数传入,得到分类标签作为返回值。

print(neigh.predict([[1.1]]))
[0]

样例输出值为0,表示K近邻分类器通过计算样本[1.1]与训练数据的距离,取0,1,2这3个邻居作为依据,根据“投票法”最终将样本分为类别0。
KNN使用经验
在实际使用时,我们可以使用所有训练数据构成特征X和标签y,使用fit()函数进行训练。在正式分类时,通过一次性构造测试集或者一个一个输入样本的方式,得到样本对应的分类结果。有关K的取值:
如果较大,相当于使用较大邻域中的训练实例进行预测,可以减小估计误差,但是距离较远的样本也会对预测起作用,导致预测错误。相反地,如果K较小,相当于使用较小的邻域进行预测,如果邻居恰好是噪声点,会导致过拟合。一般情况下,K会倾向取值较小的值,并使用交叉验证法选取最优K值。
决策树
决策树是一种树形结构的分类器,通过顺序询问分类点的属性决定分类点最终的类别。通常根据特征的信息增益或其他指标,构建一颗决策树。在分类时,只需要按照决策树中的节点依次进行判断,即可得到样本所属类别。
sklearn中的决策树
在sklearn库中,可以使用sklearn.tree.DecisionTreeClassifier创建一个决策树用于分类,其主要参数有:
criterion:用于选择属性的准则,可以传入“gini”代表基尼系数,或者“entropy”代表信息增益。
max_features:表示在决策树节点进行分裂时,从多少个特征中选择最优特征。可以设定固定数目、百分比或其他标准。它的默认值是使用所有特征个数。
决策树的应用
首先,我们导入sklearn内嵌的鸢尾花数据集:

from sklearn.datasets import load_iris
接下来,使用import语句导入决策树分类器,同时导入计算交叉验证值的函数cross_val_score。
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import import cross_val_score

使用默认参数,创建一颗基于基尼系数的决策树,并将该决策树分类器赋值给变量clf。

clf = DecisionTreeClassifier()

将鸢尾花数据赋值给变量iris。

iris = load_iris()

将决策树分类器作为待评估的模型,iris.data鸢尾花数据作为特征,iris.target鸢尾花分类标签作为目标结果,通过设定cv为10,使用10折交叉验证。得到最终的交叉验证得分。

cross_val_score(clf,iris.data,iris.target,cv=10)
....
array([1.,0.93...,0.86...,0.93...,0.93...,0.93...,0.93...,1.,0.93...,1.])

可以仿照K近邻分类器的使用方法,利用fit()函数训练模型并使用predict()函数预测:

clf.fit(X,y)
clf.predict(x)
	决策树本质上是寻找一种对特征空间上的划分,旨在构建一个训练数据拟合的好,并且复杂度小的决策树。实际使用中,需要根据数据情况,调整DecisionTreeClassifier类中传入的参数,比如选择合适的criterion,设置随机变量等。
	**朴素贝叶斯**

在这里插入图片描述
朴素贝叶斯分类器是一个以贝叶斯定理为基础的多分类器的分类器。
对于给定数据,首先基于特征的条件独立性假设,学习输入输出的联合概率布,然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
sklearn库中,实现了三个朴素贝叶斯分类器,如下三种:
native_bayes.GussianNB:高斯朴素贝叶斯
native_bayes.GussianNB:针对多项式模型的朴素贝叶斯分类器
native_bayes.GussianNB:针对多元伯努利模型的朴素贝叶斯分类器
区别在于假设某一特这个你的所有属于某个类别的观测值符合特定分布,如,分类问题的特征包括人的身高,身高符合高斯分布,这类问题适合高斯朴素贝叶斯。
sklearn中的朴素贝叶斯
在sklearn库中,可以使用sklearn.native_bayes.GaussianNB创建一个高斯朴素贝叶斯分类器,其参数有:
priors:给定各个类别的先验概率。如果为空,则按训练数据的实际情况进行统计;如果给定先验概率,则在训练过程中不能更改。
朴素贝叶斯的使用
导入numpy库,并构造训练数据X和y。

import numpy as np
X = np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])
Y = np.array([1,1,1,2,2,2])c

使用import语句导入朴素贝叶斯分类器

from sklearn.native_bayes import GaussianNB

使用默认参数,创建一个高斯朴素贝叶斯分类器,并将该分类器赋值给变量clf。

clf = GaussianNB(priors=None)

类似的,使用fit()函数进行训练,并使用predict()函数进行预测,得到预测结果为1。(测试时可以构造二维数组达到同时预测多个样本的目的)

clf.fit(X,Y)
print(clf.predict([[-0.8,-1]]))
[1]

朴素贝叶斯是典型的生成学习方法,由训练数据学习联合概率分布,并求得后验概率分布。
朴素贝叶斯一般在小规模数据上的表现很好,适合进行多分类任务。
运动状态—程序编写
算法流程
1、需要从特征文件和标签文件中将所有数据加载到内存中,由于存在缺失值,此步骤还需要进行简单的数据处理。
2、创建对应的分类器,并使用训练数据进行训练。
3、利用测试集预测,通过使用真实值和预测值的比对,计算模型整体的准确率和召回率,来评测模型。
开始——加载数据且预处理——创建分类器——训练分类器——在测试集上得到预测结果——计算准确率和召回率——结束
模块导入

import numpy as np
import pandas as pd
from sklearn.preprocessing import Imputer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

1)导入numpy库和pandas库
2)从sklearn库中导入预处理模块Imputer
3)导入自动生成训练集和测试集的模块train_test_split
4)导入预测结果评估模块classification_report

from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB

接下来,从sklearn库中依次导入三个分类器模型:
1)K近邻分类器KNeighborsClassifier
2)决策树分类器DecisionTreeClassifier
3)高斯朴素贝叶斯函数GaussianNB
数据导入函数

def load_dataset(feature_paths,label_paths):
"""读取特征文件列表和标签文件列表中的内容,归并后返回
"""
feature = np.ndarray(shape=(0,41))
label = np.ndarray(shape=(0,1))

1)编写数据导入函数,设置传入两个参数,分别是特征文件的列表feature_paths和标签文件的列表label_paths。
2)定义feature数组变量,列数量和特征维度一致为41;定义空的标签变量,列数量与标签维度一致为1。

for file in feature_path:
#使用逗号分隔符读取特征数据,将问号替换标记为缺失值,文件中不包含表头
df = pd.read_table(file,delimiter=',',na_values='?',header=None)
#使用平均值补全缺失值,然后将数据进行补全
imp = Imputer(missing_value='NaN',strategy='mean',axis=0)
imp.fit(df)
df = imp.transform(df)
#将新读入的数据合并到特征集合中
feature = np.concatenate((feature,df))

1)使用pandas库的read_table函数读取一个特征文件的内容,其中指定分隔符为逗号、缺失值为问号且文件不包含表头。
2)使用Imputer函数,通过设定strategy参数为‘mean’,使用平均值对缺失数据进行补全。fit()函数用于训练预处理器,transform()函数用于生成预处理结果。
3)将预处理后的数据加入feature,依次遍历完所有特征文件。

for file in label_paths:
	#读取标签数据,文件中不包含表头
	df = pd.read_table(file,header=None)
	#将新读入的数据合并到标签集合中
	lael = np.concatenate((label,df))
#将标签规整为一维向量
label = np.ravel(label)
return feature,label

1)遵循与处理特征文件相同的思想,我们首先使用pandas库的read_table函数读取一个标签文件的内容,其中指定分隔符为逗号且文件不包含表头行。
2)由于标签文件没有缺失值,所以直接将读取到的新数据加入label集合,依次遍历完所有标签文件,得到标签集合label。
3)最后函数将特征集合feature与标签集合label返回。
主函数—数据准备

if _name_ =='_main_'
	#设置数据路径
	feature_path =['A/A.feature','B/B.feature','C/C.feature',
	'D/D.feature','E/E.feature']
	label_paths = ['A/A.label','B/B.label','C/C.label',
	'E/E.label']
	#将前四个数据作为训练集读入
	x_train,y_train = load_dataset(feature_paths[:4],
	label_paths[:4])
	#将最后一个数据作为测试集读入
	x_test,y_test = load_dataset(feature_paths[4:],
	label_paths[4:])
	#使用全量数据作为训练集,借助train_test_split函数将训练数据打乱
	x_train,x_,y_train,y_ =   train_test_split(x_train,y_train,test_size =0.0)

1)设置数据路径feature_paths和label_paths。
2)使用Python的分片方法,将数据路径中的前4个值作为训练集,并作为参数传入load_dataset()函数中,得到训练集合的特征x_train,训练集的标签y_train。
3)将最后一个值对应的数据作为测试集,送入load_dataset()函数中,得到测试集合的特征x_test,测试集的标签y_test。
4)使用train_test_split()函数,通过设置测试集比例test_size为0,将数据随机打乱,便于后续分类器的初始化和训练。
主函数—knn

#创建k近邻分类器,并在测试集上进行预测
print("Start training knn")
knn = KNeighborsClassifier().fit(x_train,y_train)
print("Training done!")
answer_knn = knn.predict(x_test)
print("Prediction done!")

1)使用默认参数创建K近邻分类器,并将训练集x_train和y_train送入fit()函数进行训练,训练后的分类器保存到变量knn中。
2)使用测试集x_test,进行分类器预测,得到分类结果answer_knn。
主函数—决策树

#创建决策树分类器,并在测试集上进行预测
print("Strat training DT")
dt = DecesionTreeClassifier().fit(x_train,y_train)
print("Training done!")
answer_dt = dt.predict(x_test)
print("Prediction done")

1)使用默认参数创建决策树分类器dt,并将训练集x_train和y_train送入fit()函数进行训练。训练后的分类器保存到变量dt中
2)使用测试集x_test,进行分类器预测,得到分类结果answer_dt。
主函数—贝叶斯

#创建贝叶斯分类器,并在测试集上进行预测
print("Start training Bays")
gnb = GaussianNB().fit(x_train,y_train)
print("Training done!")
answer_gnb = gnb.predict(x_test)
print("Prediction done!")

1)使用默认参数创建贝叶斯分类器,并将训练集x_train和y_train送入fit()函数进行训练。训练后的分类器保存到变量gnb中。
2)使用测试集x_test,进行分类器预测,得到分类结果answer_gnb。
主函数—分类结果分析

#计算准确率与召回率
print("\n\nThe classification report for knn:")
print(classification_reprot(y_test,answer_knn))

print("\n\nThe classification report for dt:")
print(classification_report(y_test,answer_dt))

print("\n\nThe classification report for gnb:")
print(classification_report(y_test,answer_gnb))

1)使用classification_report函数对分类结果,从精确率precision、召回率recall、f1值f1-score和支持度support四个维度进行度量。
2)分别对三个份额力气的分类结果进行输出。
结果对比:

1)从准确度的角度衡量,贝叶斯分类器的效果最好。
2)从召回率和F1值的角度衡量,K近邻效果最好。
3)贝叶斯分类器和K近邻的效果好于决策树

上涨指数涨跌预测实例
数据介绍:网易财经上获得的上证指数的历史数据,爬取了150天的上证指数数据。
实验目的:根据给出当前时间前150天的历史数据,预测当天上证指数的涨跌。
技术路线:sklearn.svm.SVC
实验过程
使用方法:SVM
实验过程:
1)建立工程,导入sklearn相关包

import pandas as pd
import numpy as np
from sklearn import svm
from sklearn import cross_validation

2)数据加载和数据预处理

data=pd.read_csv('stock/000777.csv,'encoding='gbk',
parse_dates=[0],index_col=0)
data.sort_index(0,ascending=True,inplace=True)

dayfeature=150
featurenum=5*dayfeature
x=np.zeros((data.shape[0]-dayfeature,featurenum+1))
y=np.zeros((data.shape[0]-dayfeature))

读入数据
pd:pandas包的实例参数
sort_index():data按照时间升序排列
选取5列数据作为特征:收盘价、最高价、最低价、开盘价、成交量
dayfeature:选取150天的数据
featurenum:选取的5个特征天数
x:记录150天的5个特征值
y:记录涨或者跌
data.shape[0]-dayfeature意思是因为我们要用到150天的数据做训练,对于条目为200条的数据,只有50条数据是有前150天的数据来训练的,所以训练集的大小就是200-150,对于每一条数据,它的特征是前150天的所有特征数据,即150
5,+1是将当天的开盘价引入作为一条特征数据。

for i in range(0,data.shape[0]-dayfeature):
	x[i,0:featurenum]=np.array(data[i:i+dayfeature])\
	[[u'收盘价',u'最高价',u'最低价',u'开盘价',u'成交量']]).
	reshape((1,featurenum))
	//将数据中的“收盘价”“最高价”“开盘价”“成交量”存入x数组中
	x[i,featurenum]=data.ix[i+dayfeature][u'开盘价']
	//最后一列记录当日的开盘价
for i in range(0,data.shape[0]-dayfeature):
	if data.ix[i+dayfeature][u'收盘价']>=data.ix[i+dayfeature][u'开盘价']:
		y[i]=1
	else:
	y[i]=0
	//如果当天收盘价高于开盘价,y[i]=1代表涨,0代表跌

3)创建SVM并进行交叉验证

clf=svm.SVC(kernel='rbf')
//调用svm函数,并设置kernel参数,默认是rbf,其它:‘linear’‘poly’‘sigmoid’
result = []
for i in range(5):
	x_train,x_test,y_train,y_test = cross_validation.train_test_split(x,y,test_size = 0.2)
	//x和y的验证集和测试集,切分80-20%的测试集
	clf.fit(x_train,y_train)
	//训练数据进行训练
	result.append(np.mean(y_test = = clf.predict(x_test)))
	//将预测数据和测试集的验证数据比对
print("svm classifier accuacy:")
print(result)

交叉验证基本思想:交叉验证法先将数据集D划分为k个大小相似的互斥子集,每个子集都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可以获得k组训练/测试集,从而可进行k次训练和测试,最终返回的是这个k个测试结果的均值。通常把交叉验证法称为“k者交叉验证”,k最常用的取值是10,此时称为10折交叉验证。
线性回归+放假与房屋尺寸关系的线性拟合
线性回归
线性回归(Linear Regression)是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
线性回归利用统称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。
线性回归使用形如y=W^TX+b的线性模型拟合数据输入和输出之间的映射关系。
线性回归实际用途
1)如果目标是预测或者映射,线性回归可以用来观测数据集的y和X的值拟合出一个预测模型。当完成这样一个模型以后,对于一个新增的X值,在没有给定与它想配对的y的情况下,可以用这个拟合过的模型预测出一个y值。
2)给定一个变量y和一些变量X1,。。。Xp,这些变量有可能与y相关,线性回归分析可以用来量化y与Xj之间相关性的强度,评估出与y不相关的Xj,并识别出哪些Xj的子集包含了关于y的冗余信息。
线性回归的应用
背景:与房价密切相关的除了单位的房价,还有房屋的尺寸。我们可以根据已知的房屋成交价和房屋的尺寸进行线性回归,继而可以对已知房屋尺寸,而未知房屋成交价格的实例进行成交价格的预测。
目标:对房屋成交信息建立回归方程,并依据回归方程对房屋价格进行预测。
技术路线:sklearn.linear_model.LinearRegression
实例数据
成交信息只使用了房屋的面积以及对应的成交价格。
房屋面积单位为平凡英尺(ft平方)
屋成交价格单位为万元
可行性分析
1)简单而直观的方式是通过数据的可视化直接观察房屋成交价格与房屋尺寸间是否存在线性关系。
2)对于本实验的数据来说,散点图就可以很好的将其在二维平面中进行可视化表示。
在此处画出数据的散点图,其中横坐标为房屋面积,纵坐标为房屋的成交价格。总体可以看出房屋的面积和成交价格基本成正比。
实验过程
使用方法:线性回归
实验步骤:
1、建立工程并导入sklearn包
1)创建house.py文件
2)导入sklearn相关包

import matplotlib.pyplot as plt
from sklearn import linear_model

2、加载训练数据,建立回归方程

#建立datasets_X和datasets_Y用来存储数据中的房屋尺寸和房屋成交价格
datasets_X = []
datasets_Y = []
#打开数据集所在文件prices.txt,读取数据
fr = open('prices.txt','r')
#一次读取整个文件。
lines = fr.readlines()
#逐行进行操作,循环遍历所有数据。
for line in lines:
#去除数据文件中的逗号
	items = line.strip().split(',')
	#将读取的数据转换为int型,并分别写入dataset_X和dataset_Y。
	datasets_X.append(int(items[0]))
	datasets_Y.append(int(items[1]))
#求得datasets_X的长度,即为数据的总数
length = len(datasets_X)
#将datasets_X转化为数组,并变为二维,以符合线性回归拟合函数输入参数要求
datasets_X = np.array(datasets_X).reshape([length,1])
#将datasets_Y转化为数组
datasets_Y = np.array(datasets_Y)
#以数据datasets_X的最大值和最小值为范围,建立等差数列,方便后续画图
minX = min(datasets_X)
maxX = max(datasets_X)
X = np.arange(minX,maxX).reshape([-1,1])
#调用线性回归模块,建立回归方程,拟合数据
linear = linear_model.LinearRegression()
linear.fit(datasets_X,datasets_Y)

调用sklearn.linear_model.LinearRession()所需参数:
fit_intercept:布尔型参数,表示是否计算该模型截距。
normalize:布尔型参数,若为True,则X在回归前进行归一化。可选参数。默认值为False。
线性回归fit函数用于拟合输入输出数据,调用形式为
linear.fit(X,y,sample_weight=None):
X:为训练向量;
y:为相对于X的目标向量;
sample_weight:分配给各个样本的权重数组,一般不需要使用,可省略。
如果有需要,可以通过两个属性查看回归方程的系数及截距。

#查看回归方程系数
print('Coefficients:',linear.coef_)
#查看回归方程截距
print('intercept:',linear.intercept)

3、可视化处理

#scatter函数用于绘制数据点,这里表示红色绘制数据点
plt.scatter(datasets_X,datasets_Y,color = 'red')
#plot函数用来绘制直线,这里表示用蓝色绘制回归线
plt.plot(X,linear,predict(X),color = 'blue')
#xlabel和ylabel用来指定横纵坐标的名称
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()

结果
通过回归方程拟合的直线与原有数据点的关系,依据该回归方程即可通过房屋的尺寸,来预测房屋的成交价格。
多项式回归+房价与房屋尺寸关系的非线性拟合
1)多项式回归是研究一个因变量与一个或多个自变量间多项式的回归分析方法。如果自变量只有一个时,称为一元多项式回归;如果自变量有多个时,称为多元多项式回归。
2)一元m次多项式回归方程在这里插入图片描述
3)二元二次多项式回归方程在这里插入图片描述
4)在一元回归分析中,如果因变量y与自变量X的关系为非线性的,但是找不到适当的函数曲线来拟合,则可以采用一元多项式回归。
5)多项式回归的最大优点是可以通过增加X的高次项对实测点进行逼近,直至满意为止。
6)事实上,多项式回归可以处理相当一类非线性问题,它在回归分析中占有重要的地位,因为任一函数都可以分段多项式来逼近。
多项式回归的应用
应用背景:根据已知的房屋成交价和房屋的尺寸进行了线性回归,继而可以对已知房屋尺寸,而未知房屋成交价格的实例进行了成交价格的预测,但是在实际的应用中这样的拟合往往不够好,因此我们在此对该数据集进行多项式回归。
目标:对房屋成交信息建立多项式回归方程,并依据回归方程对房屋价格进行预测。
技术路线:sklearn.preprocessing.PolynomialFeatures
实例数据
成交信息包括房屋的面积以及对应的成交价格:
1)房屋面积单位为平方英尺(ft2)
2)屋成交价格单位为万
实验过程
使用方法:线性回归
实验步骤:
1、建立工程并导入sklearn包
1)创建house.py文件
2)导入sklearn相关包

import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures

sklearn中多项式回归:实际上是先将变量X处理成多项式特征,然后使用线性模型学习多项式特征的参数,以达到多项式回归的目的。
sklearn中多项式回归:
例如:X = [x1,x2]
1.)使用PolynomialFeatures构造X的二次多项式特征X_Poly
X_Poly = [x1,x2,x1x2,x12,x22]
2.)使用linear_model学习X——Poly和y之间的映射关系,即参数
w1x1+w2x2+w3x1x2+w4x12+w5x22=y
2、加载训练数据,建立回归方程。

#建立datasets_X和datasets_Y用来存储数据中的房屋尺寸和房屋成交价格
datasets_X = []
datasets_Y = []
#打开数据集所在文件prices.txt,读取数据
fr = open('prices.txt','r')
#一次读取整个文件
lines = fr.readlines()
#逐行进行操作,循环遍历所有数据
for line in lines:
	#去除数据文件中的逗号
	items = line.strip().split(',')
	#将读取的数据转换为int型,并分别写入datasets_X和datasets_Y
	datasets_X.append(int(items[0]))
	datasets_Y.append(int(items[1]))
#求得dataset_X的长度,即为数据的总数
length = len(datasets_X)
#将datasets_X转化为数组,并变为二维,以符合线性回归拟合函数输入参数要求
datasets_X = np.array(datasets_X).reshape([[length,1])
#将datasets_Y转化为数组
datasets_Y = np.array(datasets_Y)
#以数据datasets_X的最大值和最小值为范围,建立等差数列,方便后续画图。
minX = min(datasets_X)
maxX = max(datasets_X)
X = np.arrange(minX,maxX).reshape([-1,1])

#degree=2表示建立datasets_X的二次多项式特征X_poly。然后创建线性回归,使用线性模型学习X_poly和datasets_Y之间的映射关系(即参数)
poly_reg = PolynomialFeatures(degree = 2)
x_poly = poly_reg.fit_transform(datasets_X)
lin_reg2 = linear_model.LinearRegression()
lin_reg_2.fit(X_poly,datasets_Y)

3、可视化处理

#scatter用于绘制数据点,这里表示用红色绘制数据点;
plt.scatter(datasets_X,datasets_Y,color = 'red')
plot函数用来绘制回归线,同样这里需要先将X处理成多项式特征;
plt.plot(X,lin_reg_2.predict(poly_reg,fit_transform(X)),
color = 'blue')
#xlabel和ylabel用来指定横纵坐标的名称
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()

结果
通过多项式回归拟合的曲线与数据点的关系,依据该多项式回归方程即可通过房屋的尺寸,来预测房屋的成交价格。
岭回归及其应用实例
线性回归
对于一般的线性回归问题,参数求解采用的是最小二乘法,其目标函数如下:
argmi||Xw-y||2
参数w的求解,也可以使用如下矩阵方法进行:
w=(X^TX)-1XTy
对于矩阵X,若默写列线性相关性较大(即训练样本中某些属性线性相关),就会导致X^TX的值接近0,在计算(XTX)-1时就会出现不稳定。
结论:传统的基于最小二乘的线性回归法缺乏稳定性。
岭回归
岭回归的优化目标:
argmin||Xw-y||2+a||w||2
对应的矩阵求解方法为:
w=(XTX+aI)-1XTy
1)岭回归(ridge regression)是一种专用于共线性数据分析的有偏估计回归方法。
2)一种改良的最小二乘估计法,对某些数据的拟合要强于最小二乘法。
sklearn中的岭回归
在sklearn库中,可以使用sklearn.linear_model.Ridge调用岭回归模型,主要参数:
1)alpha:正则化因子,对应于损失函数中的a。
2)fit_intercept:表示是否计算截距。
3)solver:设置计算参数的方法,可选参数‘auto’、‘svd’、‘sag’等。
交通流量预测实例
数据介绍:数据为某路口的交通流量监测数据,记录全年小时级别的车流量。
实验目的:根据已有的数据创建多项式特征,使用岭回归模型代替一般的线性模型,对车流量的信息进行多项式回归。
技术路线:sklearn.linear_model.Ridgefrom
sklearn.preprocessing.PolynomialFeatures
数据实例
HR:一天中的第几个小时(0-23)
WEEK_DAY:一周中的第几天(0-6)
DAY_OF_YEAR:一年中的第几天(1-365)
WEEK_OF_YEAR:一年中的第几周(1-53)
TRAFFIC_COUNT:交通流量
全部数据集包含2万条以上数据(21626)
实例程序编写
1)建立工程,导入sklearn相关工具包

import numpy as np
#通过sklearn.linermodel加载岭回归方法
from sklearn.linear_model import Ridge
#加载交叉验证模块,加载matplotlib
from sklearn import cross_validation
import matplotlib.pyplot as plt
#通过sklearn.preprocessing加载PolynomialFeatures用于创建多项式特征,如ab,a2,b2
from sklearn.preprocessing import PolynomialFeatures

2)数据加载

#使用numpy的方法从txt文件中加载数据
data = np.genfromtxt('data.txt')
#使用plt展示车流量信息
plt.plot(data[:,4])

3)数据处理

#X用于保存0-3维数据,即属性
X = data[:,:4]
#y用于保存第4维数据,即车流量
y = data[:,4]
#用于创建最高次数6次方的多项式特征,多次试验后决定采用6次
poly = PolynomialFeatures(6)
#X为创建的多项式特征
X = poly.fit_transform(X)

4)划分训练集和测试集

#将所有的数据划分为训练集和测试集,test_size表示测试集的比例,random_state是随机种子
train_set_X,test_set_X,train_set_y,test_set_y =
cross_validation.train_test_split(X,y,test_size=0.3,random_state=0)

5)创建回归器,并进行训练

#创建岭回归实例
clf = Ridge(alpha = 1.0,fit_intercept = True)
#调用fit函数使用训练集训练回归器
clf = fit(train_set_X,train_set_y)
#利用测试集计算回归曲线的拟合优度,clf.score返回值为0.7375
#拟合优度,用于评价拟合好坏,最大为1,无最小值,当对所有输入都输出同一个值时,拟合优度为0。
clf = score(test_set_X,test_set_Y)

6)画出拟合曲线

#画一段200到300范围内的拟合曲线
start = 200
end = 300
#调用predict函数的拟合值
y_pre = clf.predict(X)
time = np.arange(start,end)
#展示真实数据(蓝色)以及拟合的曲线(红色)
plt.plot(time,y[start:end],'b',label="real")
plt.plot(time,y_pre[start:end],'r',label='predict')
#设置图例的位置
plt.legend(loc='upper left')
plt.show()

结论:预测值和真实值的大致走向是相同的。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值