python机器学习:多元线性回归(15)

作者 : 慕源网 本文共9899个字,预计阅读时间需要25分钟 发布时间: 2021-10-21 共234人阅读

python机器学习:多元线性回归(15)

本文是Python 机器学习系列的一部分。您可以在此处找到本系列之前所有帖子的链接

介绍

在上一章中,我们研究了逻辑回归。 

在本章中,我们将学习多元线性回归。

注意:如果您可以将任何事物与您自己或您的生活相关联,那么您就更有可能理解这个概念。因此,尝试通过将一切与人类联系起来来理解一切。

我们什么时候应该使用多元线性回归?

多元线性回归是简单线性回归的扩展版本,最重要的区别是它可以处理的特征数量。多元线性回归可以处理 1 个以上的特征。因此,在数据集均匀分布且要处理的特征超过 1 个的情况下,我们应该使用多元线性回归。 

我们如何计算多元线性回归? 

线性回归的公式不变,保持y= m*X+b,只是系数个数增加了

python机器学习:多元线性回归(15)

多元线性回归 

多元线性回归 (MLR) 或多元回归是一种统计技术,它使用多个准备变量来预测响应变量的结果。多元线性回归 (MLR) 的目标是对解释(自)变量和响应(因)变量之间的线性关系进行建模。

本质上,多元回归是普通最小二乘 (OLS) 回归的延伸,它涉及一个以上的解释变量。

简单线性回归是一种允许分析师或统计学家根据已知的关于另一个变量的信息对一个变量进行预测的方法。只有当一个变量有两个连续变量——一个自变量和一个因变量时,才能使用线性回归。自变量是用于计算因变量或结果的参数。多元回归模型扩展到几个解释变量。

多元回归模型基于以下假设:

  1. 线性:因变量与自变量之间存在线性关系。
  2. 相关性:自变量之间的相关性不是太高。
  3. yi 观测值是从总体中独立随机选择的。
  4. 正态分布:残差应呈正态分布,均值为 0,方差为 σ。

在解释多元回归的结果时,β 系数是有效的,同时保持所有其他变量不变(“其他都相等”)。多元回归的输出可以水平显示为方程,也可以垂直显示为表格形式。

python机器学习:多元线性回归(15)

多元线性回归示例

以IRIS数据集为例,可以直接从sklearn数据集仓库中导入。随意使用任何数据集,kaggle 和 Google Colab 上有一些非常好的数据集。

1. 使用 SkLearn

from pandas import DataFrame    
from sklearn import linear_model    
import statsmodels.api as sm   

在上面的代码中,我们导入了所需的python库。

Stock_Market = {'Year': [2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016],    
                'Month': [12, 11,10,9,8,7,6,5,4,3,2,1,12,11,10,9,8,7,6,5,4,3,2,1],    
                'Interest_Rate': [2.75,2.5,2.5,2.5,2.5,2.5,2.5,2.25,2.25,2.25,2,2,2,1.75,1.75,1.75,1.75,1.75,1.75,1.75,1.75,1.75,1.75,1.75],    
                'Unemployment_Rate': [5.3,5.3,5.3,5.3,5.4,5.6,5.5,5.5,5.5,5.6,5.7,5.9,6,5.9,5.8,6.1,6.2,6.1,6.1,6.1,5.9,6.2,6.2,6.1],    
                'Stock_Index_Price': [1464,1394,1357,1293,1256,1254,1234,1195,1159,1167,1130,1075,1047,965,943,958,971,949,884,866,876,822,704,719]            
                }  

在上面的代码中,我们定义了我们的数据。

df = DataFrame(Stock_Market,columns=['Year','Month','Interest_Rate','Unemployment_Rate','Stock_Index_Price'])    
 
X = df[['Interest_Rate','Unemployment_Rate']]    
Y = df['Stock_Index_Price'] 

在上面的代码中,我们对数据进行了预处理。

regr = linear_model.LinearRegression()    
regr.fit(X, Y) 

在上面的代码中,我们正在生成模型

print('Intercept: \n', regr.intercept_)    Multiple Linear Regression using Python
print('Coefficients: \n', regr.coef_) 

在上面的代码中,我们正在打印生成模型的参数

我得到的输出是:

Intercept:1798.4039776258546

Coefficients:[ 345.54008701 -250.14657137]

# prediction with sklearn    
New_Interest_Rate = 2.75    
New_Unemployment_Rate = 5.3    
print ('Predicted Stock Index Price: \n', regr.predict([[New_Interest_Rate ,New_Unemployment_Rate]])) 

在上面的代码中,我们正在预测与给定特征值对应的股票价格。

MLR_SkLearn.py

from pandas import DataFrame  
from sklearn import linear_model  
import statsmodels.api as sm  
  
Stock_Market = {'Year': [2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016],  
                'Month': [12, 11,10,9,8,7,6,5,4,3,2,1,12,11,10,9,8,7,6,5,4,3,2,1],  
                'Interest_Rate': [2.75,2.5,2.5,2.5,2.5,2.5,2.5,2.25,2.25,2.25,2,2,2,1.75,1.75,1.75,1.75,1.75,1.75,1.75,1.75,1.75,1.75,1.75],  
                'Unemployment_Rate': [5.3,5.3,5.3,5.3,5.4,5.6,5.5,5.5,5.5,5.6,5.7,5.9,6,5.9,5.8,6.1,6.2,6.1,6.1,6.1,5.9,6.2,6.2,6.1],  
                'Stock_Index_Price': [1464,1394,1357,1293,1256,1254,1234,1195,1159,1167,1130,1075,1047,965,943,958,971,949,884,866,876,822,704,719]          
                }  
                  
df = DataFrame(Stock_Market,columns=['Year','Month','Interest_Rate','Unemployment_Rate','Stock_Index_Price'])  
  
X = df[['Interest_Rate','Unemployment_Rate']] # here we have 2 variables for multiple regression. If you just want to use one variable for simple linear regression, then use X = df['Interest_Rate'] for example.Alternatively, you may add additional variables within the brackets  
Y = df['Stock_Index_Price']  
   
# with sklearn  
regr = linear_model.LinearRegression()  
regr.fit(X, Y)  
  
print('Intercept: \n', regr.intercept_)  
print('Coefficients: \n', regr.coef_)  
  
# prediction with sklearn  
New_Interest_Rate = 2.75  
New_Unemployment_Rate = 5.3  
print ('Predicted Stock Index Price: \n', regr.predict([[New_Interest_Rate ,New_Unemployment_Rate]]))  

输出

Intercept:1798.4039776258546
Coefficients:[ 345.54008701 -250.14657137]
Predicted Stock Index Price:[1422.86238865]
print_model = model.summary()  
print(print_model)  

输出

python机器学习:多元线性回归(15)

2. 使用 NumPy

import numpy as np  
import pandas as pd  
import matplotlib.pyplot as plt  
import seaborn as sns  

在上面的代码中,我们导入了必要的库。

my_data = pd.read_csv('home.txt',names=["size","bedroom","price"])  

在上面的代码中,我们正在导入数据。

#we need to normalize the features using mean normalization  
my_data = (my_data - my_data.mean())/my_data.std()  
  
#setting the matrixes  
X = my_data.iloc[:,0:2]  
ones = np.ones([X.shape[0],1])  
X = np.concatenate((ones,X),axis=1)  
  
y = my_data.iloc[:,2:3].values #.values converts it from pandas.core.frame.DataFrame to numpy.ndarray  
theta = np.zeros([1,3]) 

在上面的代码中,我们对数据进行了预处理。

sns.heatmap(X)  

让我们使用热图来可视化数据。

python机器学习:多元线性回归(15)

def computeCost(X,y,theta):  
    tobesummed = np.power(((X @ theta.T)-y),2)  
    return np.sum(tobesummed)/(2 * len(X))  
  
def gradientDescent(X,y,theta,iters,alpha):  
    cost = np.zeros(iters)  
    for i in range(iters):  
        theta = theta - (alpha/len(X)) * np.sum(X * (X @ theta.T - y), axis=0)  
        cost[i] = computeCost(X, y, theta)  
      
    return theta,cost  

在上面的代码中,我们定义了寻找成本和梯度下降的方法

#set hyperparameters  
alpha = 0.01  
iters = 1000  

在上面的代码中,我们设置了超参数的值。

g,cost = gradientDescent(X,y,theta,iters,alpha)  
print(g)  
  
finalCost = computeCost(X,y,g)  
print(finalCost)  

在上面的代码中,我们调用了拟合模型的方法

我得到的输出是

[[-1.10868761e-16 8.78503652e-01 -4.69166570e-02]] 0.13070336960771892

fig, ax = plt.subplots()    
ax.plot(np.arange(iters), cost, 'r')    
ax.set_xlabel('Iterations')    
ax.set_ylabel('Cost')    
ax.set_title('Error vs. Training Epoch') 

在上面的代码中,我们生成了错误与训练时期的关系图

python机器学习:多元线性回归(15)

MLR_NumPy.py

import numpy as np  
import pandas as pd  
import matplotlib.pyplot as plt  
import seaborn as sns  
  
my_data = pd.read_csv('home.txt',names=["size","bedroom","price"])  
  
#we need to normalize the features using mean normalization  
my_data = (my_data - my_data.mean())/my_data.std()  
  
#setting the matrixes  
X = my_data.iloc[:,0:2]  
ones = np.ones([X.shape[0],1])  
X = np.concatenate((ones,X),axis=1)  
  
y = my_data.iloc[:,2:3].values #.values converts it from pandas.core.frame.DataFrame to numpy.ndarray  
theta = np.zeros([1,3])  
  
sns.heatmap(X)  
  
#computecost  
def computeCost(X,y,theta):  
    tobesummed = np.power(((X @ theta.T)-y),2)  
    return np.sum(tobesummed)/(2 * len(X))  
  
def gradientDescent(X,y,theta,iters,alpha):  
    cost = np.zeros(iters)  
    for i in range(iters):  
        theta = theta - (alpha/len(X)) * np.sum(X * (X @ theta.T - y), axis=0)  
        cost[i] = computeCost(X, y, theta)  
      
    return theta,cost  
  
#set hyper parameters  
alpha = 0.01  
iters = 1000  
  
g,cost = gradientDescent(X,y,theta,iters,alpha)  
print(g)  
  
finalCost = computeCost(X,y,g)  
print(finalCost)  
  
fig, ax = plt.subplots()    
ax.plot(np.arange(iters), cost, 'r')    
ax.set_xlabel('Iterations')    
ax.set_ylabel('Cost')    
ax.set_title('Error vs. Training Epoch')

3. 使用 TensorFlow

import matplotlib.pyplot as plt  
import tensorflow as tf  
import tensorflow.contrib.learn as skflow  
from sklearn.utils import shuffle  
import numpy as np  
import pandas as pd  
import seaborn as sns 

在上面的代码中,我们正在导入所需的库

df = pd.read_csv("boston.csv", header=0)  
print (df.describe())  

在上面的代码中,我们正在导入数据集。你可以从Kaggle下载数据集

sns.heatmap(df)  

让我们将数据可视化。

python机器学习:多元线性回归(15)

f, ax1 = plt.subplots()  
  
y = df['MEDV']  
  
for i in range (1,8):  
    number = 420 + i  
    ax1.locator_params(nbins=3)  
    ax1 = plt.subplot(number)  
    plt.title(list(df)[i])  
    ax1.scatter(df[df.columns[i]],y) #Plot a scatter draw of the  datapoints  
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)  
  
plt.show()  

让我们分别可视化每个数据集列。

python机器学习:多元线性回归(15)

X = tf.placeholder("float", name="X") # create symbolic variables  
Y = tf.placeholder("float", name = "Y") 

在上面的代码中,我们定义了实际的可训练变量。

with tf.name_scope("Model"):  
  
    w = tf.Variable(tf.random_normal([2], stddev=0.01), name="b0") # create a shared variable  
    b = tf.Variable(tf.random_normal([2], stddev=0.01), name="b1") # create a shared variable  
      
    def model(X, w, b):  
        return tf.multiply(X, w) + b # We just define the line as X*w + b0    
  
    y_model = model(X, w, b)  

在上面的代码中,我们定义了模型。

with tf.name_scope("CostFunction"):  
    cost = tf.reduce_mean(tf.pow(Y-y_model, 2)) # use sqr error for cost function  
  
train_op = tf.train.AdamOptimizer(0.001).minimize(cost)  

在上面的代码中,我们定义了成本函数和成本优化器函数。

sess = tf.Session()  
init = tf.initialize_all_variables()  
tf.train.write_graph(sess.graph, '/home/bonnin/linear2','graph.pbtxt')  
cost_op = tf.summary.scalar("loss", cost)  
merged = tf.summary.merge_all()  
sess.run(init)  
writer = tf.summary.FileWriter('/home/bonnin/linear2', sess.graph)  

在上面的代码中,我们创建了可用于在 TensorBoard 上可视化模型的 garph 文件。

xvalues = df[[df.columns[2], df.columns[4]]].values.astype(float)  
yvalues = df[df.columns[12]].values.astype(float)  
b0temp=b.eval(session=sess)  
b1temp=w.eval(session=sess)  

在上面的代码中,我们确保即使在会话结束后我们也可以访问这些值。

for a in range (1,50):  
    cost1=0.0  
    for i, j in zip(xvalues, yvalues):     
        sess.run(train_op, feed_dict={X: i, Y: j})   
        cost1+=sess.run(cost, feed_dict={X: i, Y: i})/506.00  
    xvalues, yvalues = shuffle (xvalues, yvalues)  
    print ("Cost over iterations",cost1)  
    b0temp=b.eval(session=sess)  
    b1temp=w.eval(session=sess)

在上面的代码中,我们正在做训练。

print("the final equation comes out to be", b0temp,"+",b1temp,"*X","\n Cost :",cost1)      

在上面的代码中,我们正在打印模型和最终成本。

我得到的输出是

the final equation comes out to be [4.7545404 7.7991614] + [1.0045488 7.807921] *X

Cost:75.29625831573846

python机器学习:多元线性回归(15)MLR_TensorFlow.py

import tensorflow as tf  
import tensorflow.contrib.learn as skflow  
from sklearn.utils import shuffle  
import numpy as np  
import pandas as pd  
  
df = pd.read_csv("boston.csv", header=0)  
print (df.describe())  
  
f, ax1 = plt.subplots()  
import seaborn as sns  
sns.heatmap(df)  
  
y = df['MEDV']  
  
for i in range (1,8):  
    number = 420 + i  
    ax1.locator_params(nbins=3)  
    ax1 = plt.subplot(number)  
    plt.title(list(df)[i])  
    ax1.scatter(df[df.columns[i]],y) #Plot a scatter draw of the  datapoints  
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)  
  
plt.show()  
  
X = tf.placeholder("float", name="X") # create symbolic variables  
Y = tf.placeholder("float", name = "Y")  
  
with tf.name_scope("Model"):  
  
    w = tf.Variable(tf.random_normal([2], stddev=0.01), name="b0") # create a shared variable  
    b = tf.Variable(tf.random_normal([2], stddev=0.01), name="b1") # create a shared variable  
      
    def model(X, w, b):  
        return tf.multiply(X, w) + b # We just define the line as X*w + b0    
  
    y_model = model(X, w, b)  
  
with tf.name_scope("CostFunction"):  
    cost = tf.reduce_mean(tf.pow(Y-y_model, 2)) # use sqr error for cost function  
  
train_op = tf.train.AdamOptimizer(0.001).minimize(cost)  
  
  
sess = tf.Session()  
init = tf.initialize_all_variables()  
tf.train.write_graph(sess.graph, '/home/bonnin/linear2','graph.pbtxt')  
cost_op = tf.summary.scalar("loss", cost)  
merged = tf.summary.merge_all()  
sess.run(init)  
writer = tf.summary.FileWriter('/home/bonnin/linear2', sess.graph)  
  
xvalues = df[[df.columns[2], df.columns[4]]].values.astype(float)  
yvalues = df[df.columns[12]].values.astype(float)  
b0temp=b.eval(session=sess)  
b1temp=w.eval(session=sess)  
  
for a in range (1,50):  
    cost1=0.0  
    for i, j in zip(xvalues, yvalues):     
        sess.run(train_op, feed_dict={X: i, Y: j})   
        cost1+=sess.run(cost, feed_dict={X: i, Y: i})/506.00  
    xvalues, yvalues = shuffle (xvalues, yvalues)  
    print ("Cost over iterations",cost1)  
    b0temp=b.eval(session=sess)  
    b1temp=w.eval(session=sess)   
  
print("the final equation comes out to be", b0temp,"+",b1temp,"*X")

结论

在本章中,您学习了多元线性回归。

在下一章中,您将学习决策树。


慕源网 » python机器学习:多元线性回归(15)

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录