一、目录

文章分为以下几个内容:

  • 机器学习介绍
  • 机器学习步骤
  • 线性回归
  • 逻辑回归

二、机器学习介绍

机器学习就是给定一定的输入,通过施加一定的演算法,得到输出,然后通过学到的知识,输入新的数据,获得新的输出。

以网易云音乐为例,当我们在网易云听自己喜欢的每一首音乐的时候,就会形成样本数据,这些样本数据在机器学习里叫训练数据,然后再把这些样本制作成二维表格,在上面标记每首歌的数据属性(节奏,强度,听歌的时长),这些属性在机器学习中叫特征,再把每首歌分成喜欢和不喜欢,这个类别在机器学习中叫标签。接著,再把训练数据提供给机器演算法,然后它就会学习出一个关于每首歌的特征和个人是不是喜欢(标签)的一个模型,当我们在听歌的时候,它会根据歌曲的特征,输出我们是喜欢还是不喜欢。当这个模型读入越来越多的训练数据的时候,它就会变得越来越准确,且当遇到错误的时候会自动修正。上面这过程就叫机器学习。

三、机器学习步骤

  • 提出问题
  • 理解数据
  • 数据清洗
  • 构建模型
  • 评估

四、线性回归

  1. 线性回归含义

线性回归分析用于研究一个变数与另一个变数或多个变数之间的关系。

以双变数为例,变数X和变数Y之间可以有三种关系:正线性相关、负线性相关、不是线性相关(随机)。

2. 衡量变数间的相关性

衡量变数间的相关性需要一个统计量,既能够描述两个变数的相关性方向(正相关、负相关),也能够表示变数的相关性程度。

衡量变数间的相关性一般会涉及两个统计量,一个是协方差,一个是相关系数。

(1) 协方差

cov(x,y)=E[(X-E(X))(Y-E(Y))]

以两个点的协方差计算为例:

frac{(x1-ux)(y1-uy)+(x2-ux)(y2-uy)}{2}

注:Ux是X的均值, Uy是Y的均值

(2) 相关系数

r=frac{X和Y的协方差}{X的标准差 	imes Y的标准差}

=frac{cov(X,Y)}{sigma xsigma y}

其中-1<=r<=1

  • 当r=1时,完全正相关
  • 当r=-1时,完全负相关
  • 当r=0时,表示不是线性相关, 但可能是其他相关, 只能说他不是线性相关
  • 一般来讲,0至0.3或-0.3至0表示相关性较弱,0.3至0.6或-0.6至-0.3表示中等程度相关,0.6至1或-1至-0.6表示变数强相关。

(3) 协方差和相关系数间的区别

相关系数是标准化后的协方差,消除了变数变化幅度的影响,表示变数每单位变化的相似程度。

(4) 相关系数-Python实现 :

#相关系数:corr返回结果是一个数据框,存放的是相关系数矩阵
rDf=examDf.corr()
print(相关系数矩阵:)
rDf

3. 线性回归

(1) 简单线性回归利用python实现

简单线性回归

from collections import OrderedDict
import pandas as pd

  • 第一步,建立数据集

#数据集
examDict={
学习时间:[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,
2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
分数: [10, 22, 13, 43, 20, 22, 33, 50, 62,
48, 55, 75, 62, 73, 81, 76, 64, 82, 90, 93]
}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)

  • 第二步:提取标签和特征

#提取特征和标签
#特征features
exam_X=examDf.loc[:,学习时间]
#标签labes
exam_y=examDf.loc[:,分数]
#绘制散点图
import matplotlib.pyplot as plt

#散点图
plt.scatter(exam_X, exam_y, color="b", label="exam data")

#添加图标标签
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()

  • 第三步:建立训练数据和测试数据


train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取训练数据(train)和测试数据(test)
第一个参数:所要划分的样本特征
第2个参数:所要划分的样本标签
train_size:训练数据占比,如果是整数的话就是样本的数量

from sklearn.cross_validation import train_test_split

#建立训练数据和测试数据
X_train , X_test , y_train , y_test = train_test_split(exam_X ,
exam_y ,
train_size = .8)
#输出数据大小
print(原始数据特征:,exam_X.shape ,
,训练数据特征:, X_train.shape ,
,测试数据特征:,X_test.shape )

print(原始数据标签:,exam_y.shape ,
训练数据标签:, y_train.shape ,
测试数据标签: ,y_test.shape)
原始数据特征: (20,) ,训练数据特征: (16,) ,测试数据特征: (4,)
原始数据标签: (20,) 训练数据标签: (16,) 测试数据标签: (4,)
#绘制散点图
import matplotlib.pyplot as plt

#散点图
plt.scatter(X_train, y_train, color="blue", label="train data")
plt.scatter(X_test, y_test, color="red", label="test data")

#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Pass")
#显示图像
plt.show()

  • 第四步:构建训练模型


sklearn要求输入的特征必须是二维数组的类型,但是因为我们目前只有1个特征,所以需要用reshape转行成二维数组的类型。
错误提示信息:Reshape your data either using array.reshape(-1, 1) if your data has a single feature

#将训练数据特征转换成二维数组XX行*1列
X_train=X_train.values.reshape(-1,1)
#将测试数据特征转换成二维数组行数*1列
X_test=X_test.values.reshape(-1,1)

#第1步:导入线性回归
from sklearn.linear_model import LinearRegression
# 第2步:创建模型:线性回归
model = LinearRegression()
#第3步:训练模型
model.fit(X_train , y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

  • 第五步:最优拟合线


最佳拟合线:z=??+??x
截距intercept:a
回归系数:b

#截距
a=model.intercept_
#回归系数
b=model.coef_

print(最佳拟合线:截距a=,a,,回归系数b=,b)
最佳拟合线:截距a= 11.1707480711 ,回归系数b= [ 15.48742033]
#绘图
import matplotlib.pyplot as plt
#训练数据散点图
plt.scatter(X_train, y_train, color=blue, label="train data")

#训练数据的预测值
y_train_pred = model.predict(X_train)
#绘制最佳拟合线
plt.plot(X_train, y_train_pred, color=black, linewidth_=3, label="best line")

#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()

(2) 评估模型精确度

  • 最佳拟合线

能最好地接近所有数据点的线被称最佳拟合线,要求出最佳拟合线,可以首先假设直线公式为y=a+bx。最佳拟合线即表达式为y=a+bx且使得y的实际观察值与每个x相对应的y的估计值的差距为最小的线。

  • 决定系数R平方

一个点的误差=实际值-预测值

y误差平方和= Sigma(y实际值-y预测值)^2 【y预测值:用直线估计出的值】

y的总波动= Sigma(y实际值-y平均值)^2

有多少百分比的y波动没有被回归线描述=误差平方和/总波动

决定系数R平方=有多少百分比的y波动被回归线描述

=1-误差平方和/总波动

故由上可得出决定系数R:

1、可表示回归线拟合程度,有多少百分比的y波动可以有回归线来描述(X的波动变化)

2、R越大,回归模型越精确

  • 决定系数R平方利用python实现

#线性回归的scroe方法得到的是决定系数R平方
#评估模型:决定系数R平方
model.score(X_test , y_test)
0.83901474742039228
#绘图
import matplotlib.pyplot as plt
#训练数据散点图
plt.scatter(X_train, y_train, color=blue, label="train data")

#训练数据的预测值
y_train_pred = model.predict(X_train)
#绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
plt.plot(X_train, y_train_pred, color=black, linewidth_=3, label="best line")

#测试数据散点图
plt.scatter(X_test, y_test, color=red, label="test data")

#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()

4. 逻辑回归

逻辑回归是应用非常广泛的一个分类机器学习演算法,它将数据拟合到一个logistic函数中,从而能够完成对事件发生的概率进行预测。从大的类别上来说,逻辑回归是一种有监督的统计学习方法,主要用于对样本进行分类。

在线性回归模型中,输出一般是连续的,例如

y=f(x)=ax+b

对于每一个输入的x,都有一个对应的y输出。x和y都是连续型数据。但是对于逻辑回归,输入可以是连续的,但输出一般是离散的,即只有有限多个输出值。例如,其值域可以只有两个值{0, 1},这两个值可以表示对样本的某种分类,高/低、患病/健康、阴性/阳性等,这就是最常见的二分类逻辑回归。

逻辑回归与线性回归的关系

逻辑回归与线性回归模型的形式基本上相同,都具有 ax+b,其中a和b是待求参数,其区别在于他们的因变数不同,线性回归直接将ax+b作为因变数,即y = ax+b,而logistic回归则通过函数S将ax+b对应到一个隐状态p,p= S(ax+b),然后根据p与1-p的大小决定因变数的值。这里的函数S就是Sigmoid函数。

逻辑函数: y=S(z)=frac{1}{1+e^{-z}}

逻辑函数值y表示:当分类结果的标签等于1时,x对应的概率值

其中:z=a+bx——线性回归

机器学习模型所做得事情就是将训练数据的特征,和标签转化成一个决策面。逻辑回归,函数得到概率值以后,如何映射到标签0或标签1上,就是决策面要做的事情。如果逻辑函数获得概率数值y>=0.5,那么标签=1,如果逻辑函数获得概率值y<0.5,那么标签=0.

逻辑回归Python实现

建立数据集

from collections import OrderedDict
import pandas as pd
import numpy as np
#数据集
examDict={
学习时间:[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50,
2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
通过考试:[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]
}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)
examDf.head()

提取特征和标签

#特征features
exam_X=examDf.loc[:,学习时间]
#标签labes
exam_y=examDf.loc[:,通过考试]

绘制散点图

import matplotlib.pyplot as plt

#散点图
plt.scatter(exam_X, exam_y, color="b", label="exam data")

#添加图标标签
plt.xlabel("Hours")
plt.ylabel("Pass")
#显示图像
plt.show()

.建立训练数据集和测试数据集


train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取训练数据(train)和测试数据(test)
第一个参数:所要划分的样本特征
第2个参数:所要划分的样本标签
train_size:训练数据占比,如果是整数的话就是样本的数量

from sklearn.cross_validation import train_test_split

#建立训练数据和测试数据
X_train , X_test , y_train , y_test = train_test_split(exam_X ,
exam_y ,
train_size = .8)
#输出数据大小
print(原始数据特征:,exam_X.shape ,
,训练数据特征:, X_train.shape ,
,测试数据特征:,X_test.shape )

print(原始数据标签:,exam_y.shape ,
训练数据标签:, y_train.shape ,
测试数据标签: ,y_test.shape)
原始数据特征: (20,) ,训练数据特征: (16,) ,测试数据特征: (4,)
原始数据标签: (20,) 训练数据标签: (16,) 测试数据标签: (4,)

#绘制散点图
import matplotlib.pyplot as plt

#散点图
plt.scatter(X_train, y_train, color="blue", label="train data")
plt.scatter(X_test, y_test, color="red", label="test data")

#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Pass")
#显示图像
plt.show()

训练模型(使用训练数据)


理解了reshape后,我们再来看下逻辑回归模型
sklearn要求输入的特征必须是二维数组的类型,但是因为我们目前只有1个特征,所以需要用安装错误提示用reshape转行成二维数组的类型。
错误提示信息:Reshape your data either using array.reshape(-1, 1) if your data has a single feature

#将训练数据特征转换成二维数组XX行*1列
X_train=X_train.values.reshape(-1,1)
#将测试数据特征转换成二维数组行数*1列
X_test=X_test.values.reshape(-1,1)

#导入逻辑回归包
from sklearn.linear_model import LogisticRegression
# 创建模型:逻辑回归
model = LogisticRegression()
#训练模型
model.fit(X_train , y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class=ovr, n_jobs=1,
penalty=l2, random_state=None, solver=liblinear, tol=0.0001,
verbose=0, warm_start=False)

模型评估(使用测试数据)

#评估模型:准确率
model.score(X_test , y_test)
0.75

进一步理解什么是逻辑函数

#获取概率值
#第1个值是标签为0的概率值,第2个值是标签为1的概率值
model.predict_proba(3)
array([[ 0.3294175, 0.6705825]])
#预测数据:使用模型的predict方法可以进行预测。这里我们输入学生的特征学习时间3小时,模型返回结果标签是1,就代表预测该学生未通过考试。
pred=model.predict([[3]])
print(pred)
[1]

理解逻辑回归函数
斜率slope
截距intercept

#第1步:得到回归方程的z值
#回归方程:z=??+??x
#截距
a=model.intercept_
#回归系数
b=model.coef_

x=3
z=a+b*x

#第2步:将z值带入逻辑回归函数中,得到概率值
y_pred=1/(1+np.exp(-z))
print(预测的概率值:,y_pred)
预测的概率值: [[ 0.6705825]]

推荐阅读:

相关文章