案例:
制作玩偶的数量和成本之间的关系
生产个数: xi
实际生产成本:yi
模型预测的成本:yi^
数学推导:
1.数学公式
yi = xi + εi
2.损失函数(loss function)
LL = Σi |yi -yi^|
因为上式不可导,重新定义损失函数如下:
L = Σi (yi - 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 Σi (yi - axi - b)2
5.评估模型
5.1 预测角度看,模型的预测成本越接近真实成本
越好。
如下公式定义线性模型的均方差,均方差越小,模型效果越好
MSE = 1/n Σni = 1 (yi - yi^)2 = 1/n L
5.2 解释数据角度看,我们希望模型最大程度地解释预成本化的原因。即未被模型解释的成本(yi - y^i)占成本变化(yi - 1/nΣyi)的比例越小越好。
如下公式定义模型的决定系数,决定系数越接近1,模型效果越好
y¯ = 1/n Σni = 1 yi
SStot = Σi (yi - y¯)2 -------------因变量方差
SSres = Σi (yi - yi^)2 -------------未被模型(或说自变量)解释的方差
SSreg = Σi (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