回归分析研究的是因变量和自变量之间的关系。本章学习回归分析的目标有以下几点:
- 线性回归的基本概念
- 一元线性回归和多元线性回归
- 基于线性回归的股票特征提取与预测
- 逻辑回归
- 基于逻辑回归的环境数据检测
PART1-线性回归的基本概念
1.基本概念
在统计上,研究相关关系可以运用回归分析和相关关系。
当自变量为非随机变量而因变量为随机变量时,它们的关系分析称为回归分析;【具有相关关系的变量之间虽然具有某种不确定性,但是通过对现象的不断观察可以探索出他们之间的统计规律,这类统计规律称为回归关系,有关回归关系的理论、计算和分析称为回归分析】
当自变量和因变量都是随机变量时,它们的关系分析称为相关分析;
回归分析和相关分析往往不加区分,广义上说,相关分析包括回归分析,但严格来说两者又是有区别的。相关分析常用回归分析来补充,两者相辅相成。若通过相关分析显示出变量间关系非常密切,则通过所建立的回归方程可获得相当准确的取值。
- 考虑具有相关关系的两个变量
和,它们之间存在密切关系,但并不能由一个变量的数值精确的求出另一个变量的值。相关分析通常以某一指标来度量回归方程所描述的各个变量间关系的密切程度。
- 通常选定
时的数学期望作为对应时的代表值,因为它反映条件下取值的平均水平,这样对应的关系称为回归关系。根据回归关系可以建立变量之间的数学表达式,称为回归方程,反应自变量在固定条件下因变量的平均状态变化情况。
2.可以解决的问题
- 建立变量间的数学表达式,通常称为经验公式
- 利用概率统计基础知识进行分析,从而判断所建立的经验公式的有效性
- 进行因素分析,确定影响某一变量的若干变量中,何者为主要,何者为次要,以及他们之间的关系
3.步骤和分类
- 确定自变量、因变量并进行说明
- 进行回归分析
- 给出因变量和说明变量之间的关系,以公式形式给出
- 预测因变量的未来值
回归分析可以分为线性回归分析和非线性回归分析。
线性回归分析分为一元线性回归和多元线性回归。
非线性回归分析种类比较多,常用的有渐进回归、二次曲线、双曲线、逻辑回归等。
渐进回归-
二次曲线-
双曲线-
逻辑回归-
-----------------------------------------------------------------------------------------------
PART2-一元线性回归&多元线性回归
- 一元线性回归也称为简单线性回归,指自变量和因变量都只有一个。如果自变量Y和因变量X之间存在高度的正相关,则可以确定一条直线方程,使得所有的数据点尽可能接近这条拟合的直线。用方程可表示为:
。其中分别为因变量和自变量,分别为截距和回归系数。
- 多元线性回归是一元线性回归的推广,指多个因变量对多个自变量的回归分析。最常用的是一个因变量、多个自变量的情况,也称为多重回归分析,用方程可以表示为:
。其中分别为因变量和个自变量,分别为截距和个回归系数。
- 用python实现一元线性回归
这里实现的是一个房价预测的例子,目的是根据房子的尺寸大小,预测房子的价格。现已有数据如下所示,这里我自己在excel中输入的数据并保存在路径下面的:
'''
一元线性回归实例
'''
#需要的包
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import linear_model
'''
1.读取数据函数
'''
def get_data(file_name):
data = pd.read_excel(file_name)
X_parameter = []
Y_parameter = []
for single_square_feet,single_price_value in zip(data['平方英尺'],data['价格']):
#遍历数据
X_parameter.append([float(single_square_feet)])
Y_parameter.append([float(single_price_value)])
return X_parameter,Y_parameter
'''
2.训练线性模型的函数
'''
def linear_model_main(X_parameter,Y_parameter,predict_value):
#创建线性回归对象
regr = linear_model.LinearRegression()
#训练模型
regr.fit(X_parameter,Y_parameter)
#把要预测的数值放进去训练好的模型进行预测
predict_outcome = regr.predict(predict_value)
#创建一个预测结果的字典
predictions = {}
#把预测结果加入到字典中
#intercept-截距值a;coefficient-系数b;predicted_value-预测结果值
predictions['intercept'] = regr.intercept_
predictions['coefficient'] = regr.coef_
predictions['predicted_value'] = predict_outcome
return predictions
'''
3.显示线性拟合模型结果函数
'''
def show_linear_line(X_parameter,Y_parameter):
#创建线性回归对象
regr = linear_model.LinearRegression()
regr.fit(X_parameter,Y_parameter)
plt.figure()
plt.scatter(X_parameter,Y_parameter)
plt.plot(X_parameter,regr.predict(X_parameter),color = 'red',linewidth = 4)
plt.xticks(())
plt.yticks(())
plt.show()
'''
4.对实际数据集进行训练并显示结果
'''
X,Y = get_data(r"E:python_workspaceJupyter_workspacetest6.xls")
predictvalue = 700
result = linear_model_main(X,Y,predictvalue)
print("Intercept value:",result['intercept'])
print("Coefficient:",result['coefficient'])
print("Predicted value:",result['predicted_value'])
show_linear_line(X,Y)
预测输出结果如下:
预测显示结果如下:
- 用python实现多元线性回归
针对多元线性回归的实例使用的是一个广告的例子。数据是从提供的网址中下载的,前十条数据如下所示,一共有200条数据。一共4个变量,其中TV、radio、newspaper是自变量,sales是因变量,即探究商品的销售额与电视广告的投入、收音机广告投入和报纸广告投入之间的关系。这里我们将得到模型:
'''
多元线性回归
'''
#需要的包
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression
'''
1.导入数据
'''
data = pd.read_csv(r"E:python_workspaceMachine_learningAdvertising.csv")
'''
2.使用散点图将特征与响应之间的关系可视化出来-观察单个自变量和因变量之间的相关程度
'''
#size和aspect参数调节显示的大小和比例;kind添加最佳拟合直线和95%的置信带
sns.pairplot(data,x_vars = ['TV','radio','newspaper'],y_vars = 'sales',size = 7,aspect = 0.8,kind = 'reg')
plt.show()
'''
3.使用pandas构建X(特征向量)和y(标签列)
'''
#创建特征列表
feature_cols = ['TV','radio','newspaper']
#使用列表选择原始DataFrame的子集
X = data[feature_cols]
X = data[['TV','radio','newspaper']]
print(X.head())
print(type(X))
print(X.shape)
#从DataFrame中选择一个Series得到标签列
y = data['sales']
y = data.sales
#输出前五项数据
print(y.head())
'''
4.构建训练集与测试集
'''
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 1)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
'''
5.sklearn线性回归
'''
linreg = LinearRegression()
model = linreg.fit(X_train,y_train)
print(model)
print(linreg.intercept_)
print(linreg.coef_)
'''
6.预测
'''
y_pred = linreg.predict(X_test)
print(y_pred)
print(type(y_pred))
'''
7.评价测度
'''
#计算sales预测的RMSE
print(type(y_pred),type(y_test))
print(len(y_pred),len(y_test))
print(y_pred.shape,y_test.shape)
sum_mean = 0
for i in range(len(y_pred)):
sum_mean += (y_pred[i] - y_test.values[i]) ** 2
sum_erro = np.sqrt(sum_mean/50)
print("RMSE by hand:",sum_erro)
'''
8.绘制ROC曲线
'''
import matplotlib.pyplot as plt
plt.figure()
plt.plot(range(len(y_pred)),y_pred,'b',label = 'predict')
plt.plot(range(len(y_pred)),y_test,'r',label = 'test')
plt.legend(loc = 'upper right')
plt.xlabel("the number of sales")
plt.ylabel("value of sales")
plt.show()
显示结果如下: