线性回归(1) —— 机器学习角度

案例:

制作玩偶的数量和成本之间的关系

  生产个数: xi

  实际生产成本:yi

  模型预测的成本:yi^


 数学推导:

1.数学公式

  yi = x+ εi

2.损失函数(loss function)

  LL = Σ|y-yi^|

  因为上式不可导,重新定义损失函数如下:

  L = Σi  (y- yi^)2 

3.提取特征

  3.1 原始特征 X = {xi}

  3.2 对原始特征作数学变换,如: X2

4.模型公式&参数估计

   4.1 模型公式

    yi^ = axi + b

  4.2 参数估计 

    参数(a,b)的估计值(a^,b^)将使得损失函数 L 达到最小值:

    (a^,b^) = argmina,b Σ (y- axi - b)2 

 5.评估模型

  5.1 预测角度看,模型的预测成本越接近真实成本

越好。

     如下公式定义线性模型的均方差,均方差越小,模型效果越好

    MSE = 1/n Σni = 1 (y- yi^)2  = 1/n L

  5.2 解释数据角度看,我们希望模型最大程度地解释预成本化的原因。即未被模型解释的成本(y- y^i)占成本变化(y- 1/nΣyi)的比例越小越好。

     如下公式定义模型的决定系数,决定系数越接近1,模型效果越好

    y¯ = 1/n Σni = 1 y

    SStot  = Σ (y- y¯)2     -------------因变量方差

    SSres  = Σ (y- yi^)2    -------------未被模型(或说自变量)解释的方差

    SSreg  = Σ (yi^ - y¯)2   -------------已被模型(或说自变量)解释的方差

    R2 = 1 - SSres / SStot    -------------决定系数

    R2 = SSreg / SStot           -------------决定系数 (因变量的方差中可被自变量解释的比例)


代码实现:

线性回归:

def linearModel(data):
    """
   线性回归模型建模步骤展示
参数: -------- data: DataFrame,建模数据 """ features = ["x"] labels = ["y"] #划分训练集和测试集 trainData = data[15:] testData = data[:15] #产生并训练模型 model = trainModel(trainData, features, labels) #评价模型效果 error, score = evalueteModel(model, testData, features, labels) # 图形化模型 visualizeModel(model, data, features, labels, error, score)

训练模型——scikit-learn

 1 from sklearn import linear_model
 2 
 3 def trainModel(trainData, features, labels):
 4     """
 5     利用训练数据,估计模型参数
 6     参数:
 7     -----------------
 8     trainData : DataFrame, 训练数据集,包含特征和标签
 9     features  : 特征名列表
10     labels    : 标签名列表
11 
12     返回:
13     ----------------
14     model:LinearRegression, 训练好的线性模型   
15      """
16     #创建一个线性回归模型
17     model = linear_model.LinearRegression()
18 
19     #训练模型
20     model.fit(trainData[features], trainData[labels])
21 
22     return model

评价模型

 1 import numpy as np
 2 
 3 def evalueteModel(model, testData, features, labels):
 4     """
 5     计算线性模型及方差和决定系数
 6     参数:
 7     -------------
 8     model     : LinearRegression,训练完成的线性模型
 9     testData : DataFrame,测试数据集
10     features : list[str], 特征名列表
11     labels     : list[str], 标签名列表
12 
13     返回:
14     -------------
15     error : np.floate64,均方差
16     score: np.floate64,决定系数
17     """
18     #均方差(The mean squared eror),均方差越小越好
19     error = np.mean((model.predict(testData[features]) - testData[labels])**2)
20     #决定系数(Coefficient of determination),决定系数越接近1越好
21     score = model.score(testData[features], testData[labels])
22 
23     return error, score

猜你喜欢

转载自www.cnblogs.com/Colleen-Blog/p/10307611.html