一、如何学习回归分析?

1.学习回归分析之前,我们需要先明白什么是回归分析? 为什么要学习回归分析?

简单线性回归

初中时期,我们都学习过简单的线性方程。例如,一元一次方程、一元二次方程等。这些简单的线性方程就是回归分析中线性回归的一种体现,通过线性回归方程,我们可以输入一个自变量得到一个预测的因变量。简单线性回归的自变量和因变量也被称为特征和标签。因为线性回归具有预测功能,所以线性回归时常运用到生活当中。例如,我们可以输入湿度、温度等信息来预测降雨的可能性。当然,线性回归有他的缺点。一般来说,线性回归输入的自变量(特征)类型必须是连续的数字类型。当我们需要用到一些分类数据时,例如,性别、工作、单位等,线性回归便无法使用。线性回归的公式一般可以写作:Y=aX1+aX2+.......+aXx+b, X的数量代表特征标签的数量。

逻辑回归

逻辑回归和线性回归很相似,但是逻辑在特征变量和标签的处理上有所不同。逻辑回归可以处理分类型的特征变量,例如,是与否类型的变量。逻辑回归输出的结果和线性回归不同,线性回归输出的结果一般是连续型的数字,但是逻辑回归输出的结果一般是0或1。0和1的含义会根据标签的不同而改变,但一般来说0表示否定1表示肯定。逻辑回归的公式一般可以写作:

Z代表一般线性回归的公式

2.回归分析实操学习

简单线性回归

接下来,我们开始学习如何用用Python实习简单线性回归的构建。首先,我们先创造一个含有特征变量和标签的字典,并将字典转化为DataFrame格式。

import pandas as pd
from collections import OrderedDict
#创建一个字典储存自变量和因变量
Rain={'Humidity':[0.1,0.5,0.3,0.9,0.7,0.8,0.3,0.4,0.5,0.6],
'Chance_of_Rain':[0.2,0.3,0.15,0.8,0.6,0.7,0.1,0.2,0.4,0.6]}
#将字典内的顺序排列
Rain=OrderedDict(Rain)
#将字典转化为DataFrame格式
Raindf=pd.DataFrame(Rain)
Raindf
#结果
HumidityChance_of_Rain
00.1 0.20
10.5 0.30
20.3 0.15
30.9 0.80
40.7 0.60
50.8 0.70
60.3 0.10
70.4 0.20
80.5 0.40
90.6 0.60
接下来,我们需要从DataFrame中选取特征(自变量)和标签(因变量)。并且,我们可以使用特征和标签的对应关系绘制散点图进行描述性统计观察。
#提取自变量和因变量
Rain_x=Raindf.loc[:,'Humidity']
Rain_y=Raindf.loc[:,'Chance_of_Rain']
#利用自变量和因变量绘制图型
import matplotlib.pyplot as plt
#选择散点图类型
plt.scatter(Rain_x,Rain_y,color='r',label='Rain_Data')
#显示横坐标和纵坐标的标签
plt.legend(loc=2)
plt.xlabel('Humidity')
plt.ylabel('Chance_of_Rain')
#显示图型
plt.show()
#结果
观察上图,我们发现随着湿度的增加下雨的概率也上升。接下来,我们可以使用机器学习包Sklearn中的线性回归算法来构建线性回归模型。
#利用机器学习包训练简单线性回归
from sklearn.model_selection import train_test_split
#将原始数据分为训练数据和测试数据
X_train, X_test, Y_train, Y_test =train_test_split(Rain_x, Rain_y, train_size=0.7)
#我们将数据中的70%划为训练数据,剩下的为测试数据
print('训练数据特征:',X_train.shape,'训练数据标签:',Y_train.shape,
'测试数据特征:',X_test.shape,'测试数据标签:',Y_test.shape)
#结果
训练数据特征: (7,) 训练数据标签: (7,) 测试数据特征: (3,) 测试数据标签: (3,)
#将训练数据和测试数据用图型显示
import matplotlib.pyplot as plt
#选择散点图
plt.scatter(X_train,Y_train,color='r',label='train_data')
plt.scatter(X_test,Y_test,color='b',label='test_data')
#显示横坐标和纵坐标的标签
plt.legend(loc=2)
plt.xlabel('Humidity')
plt.ylabel('Chance_of_Rain')
#显示图型
plt.show()
#结果
上图显示了训练数据和测试数据所包含的点,每次分配训练数据和测试数据时结果会变化。可以引入seed()函数锁定选中的数据,之后再次运行模型时结果就不会发生变化了。
#检查特征变量的类型
print(type(X_train),type(X_test))
#结果
#由于我们只有一组特征变量,所以我们需要将特征变量转为二维数据组防止报错
#将特征变量转化为二维数据
#将训练组的特征变量转化为二维数组
X_train=X_train.values.reshape(-1,1)
#将测试组的特征变量转化为二维数组
X_test=X_test.values.reshape(-1,1)
#检查特征变量改变后的类型
print(type(X_train),type(X_test))
#结果
#利用线性回归构建回归模型
from sklearn.linear_model import LinearRegression
#构建模型
model=LinearRegression()
#训练模型
model.fit(X_train, Y_train)
#结果
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
#检查一元线性回归的截距和参数
#参数
a=model.coef_
#截距
b=model.intercept_
#输出回归方程
print('回归方程为:Y=',b,'+',a,'X')
#结果
回归方程为:Y= 0.0166666666667 + [ 0.80092593] X
#查看回归方程的解释度R2
model.score(X_test,Y_test)
#结果
0.86893467921473388 #R2表示86.89%的标签变化被特征变量变化给解释了
#绘制回归方程图形
import matplotlib.pyplot as plt
#绘制训练数据的散点图
plt.scatter(X_train,Y_train,color='r',label='train_data')
#绘制测试数据的散点图
plt.scatter(X_test,Y_test,color='g',label='test_data')
#通过回归方程预测训练数据的值
predict_train=model.predict(X_train)
#将方程预测训练数据的值绘制成图
plt.plot(X_train,predict_train,color='b',label='predict_line')
#显示横坐标和纵坐标的标签
plt.legend(loc=2)
plt.xlabel('Humidity')
plt.ylabel('Chance_of_Rain')
#显示图型
plt.show()
#结果

图中蓝线为函数的拟合直线,函数拟合直线是通过最小二乘法计算出与训练数据误差最小的直线。

逻辑回归

接下来,我们开始学习如何用用Python实习逻辑回归的构建。首先,我们先创造一个含有特征变量和标签的字典,并将字典转化为DataFrame格式。

import pandas as pd
from collections import OrderedDict
#创建一个字典储存自变量和因变量
If_Rain={'Humidity':[0.1,0.5,0.3,0.9,0.7,0.8,0.3,0.4,0.5,0.6],
'Rain':[0,0,0,1,1,1,0,0,0,1]}
#将字典转化为DataFrame格式
If_Rain=pd.DataFrame(If_Rain)
If_Rain
#结果
HumidityRain
00.1 0
10.5 0
20.3 0
30.9 1
40.7 1
50.8 1
60.3 0
70.4 0
80.5 0
90.6 1
接下来,我们需要从DataFrame中选取特征(自变量)和标签(因变量)。并且,我们可以使用特征和标签的对应关系绘制散点图进行描述性统计观察。
#提取自变量和因变量
If_Rain_x=If_Rain.loc[:,'Humidity']
If_Rain_y=If_Rain.loc[:,'Rain']
#利用自变量和因变量绘制图型
import matplotlib.pyplot as plt
#选择散点图类型
plt.scatter(If_Rain_x,If_Rain_y,color='r',label='Rain data')
#显示横坐标和纵坐标的标签
plt.xlabel('Humidity')
plt.ylabel('If_Rain')
plt.legend(loc=2)
#显示图型
plt.show()
#结果

观察上图,我们发现随是否降雨只存在两种可能,所以散点只会分布在上下两端。下雨往往伴随着湿度的增大,而当湿度较小时一般不会下雨。接下来,我们可以使用机器学习包Sklearn中的逻辑回归算法来构建线性回归模型。

#利用机器学习包训练逻辑回归
from sklearn.linear_model import LogisticRegression
#将原始数据分为训练数据和测试数据
x_train, x_test, y_train, y_test=train_test_split(If_Rain_x,If_Rain_y,train_size=5)
#我们将数据中的70%划为训练数据,剩下的为测试数据
print('训练数据特征:',x_train.shape,'训练数据标签:',y_train.shape,
'测试数据特征:',x_test.shape,'测试数据标签:',y_test.shape)
#结果
训练数据特征: (5,) 训练数据标签: (5,) 测试数据特征: (5,) 测试数据标签: (5,)
#将训练数据和测试数据用图型显示
import matplotlib.pyplot as plt
#选择散点图
plt.scatter(x_train,y_train,color='r',label='train_data')
plt.scatter(x_test,y_test,color='b',label='test_data')
#显示横坐标和纵坐标的标签
plt.legend(loc=2)
plt.xlabel('Humidity')
plt.ylabel('If_Rain')
#显示图型
plt.show()
#结果
上图显示了训练数据和测试数据所包含的点,每次分配训练数据和测试数据时结果会变化。可以引入seed()函数锁定选中的数据,之后再次运行模型时结果就不会发生变化了。
#检查特征变量的类型
print(type(x_train),type(x_test))
#结果
#由于我们只有一组特征变量,所以我们需要将特征变量转为二维数据组防止报错
#将特征变量转化为二位数据
#将训练组的特征变量转化为二维数组
x_train=x_train.values.reshape(-1,1)
#将测试组的特征变量转化为二维数组
x_test=x_test.values.reshape(-1,1)
#检查特征变量改变后的类型
print(type(X_train),type(X_test))
#结果
#利用线性回归构建回归模型
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.59999999999999998 #模型的预测精度为60%,精确度低是因为我们使用的数据比较少。
#查看分布概率
model.predict_proba([[0.7]]) #当特征变量为0.7是的概率分布
#结果
array([[ 0.52179604, 0.47820396]]) #第一项为0的概率,第二项为1的概率,由于0的概率大于0.5,
#因此输出的结果为0,0表示不下雨。
#查看预测结果
Result=model.predict([[0.5]]) #查看当特征变量为0.5是的结果
print(Result)
#结果
[0] #当特征变量为0.5时,逻辑回归会输出0作为结果,0表示不下雨。
我们也可以直接通过函数来计算预测的概率值
import numpy as np
#通过逻辑回归公式计算模型预测的概率值
#参数
c=model.coef_
#截距
d=model.intercept_
#Z的计算公式
x=0.6 #表示特征变量为0.6
z=c*x+d
#用逻辑回归公式求解
predict_result=1/(1+np.exp(-z))
print(predict_result)
#结果
[[ 0.47021545]] #特征变量为0.6时,预测的概率值为0.47,因此结果为不下雨

总结

线性回归和逻辑回归的用处非常的广泛,虽然本文只用到了一个特征变量,但是我们更加清晰的了解到线性回归和逻辑回归的本质。只有在了解回归本质的基础上学习才能达到事半功倍的效果,不要过度的最求高大上的代码和复杂的模型。切记,一切的编码操作以基础为主。在接触到新的东西时要首先弄明白原理和应用的场景,在吃透原理的基础上在想更高层次进发才能更从容。