线性回归

线性回归是一种用于建立自变量和因变量之间线性关系的统计模型。其步骤及代码如下所示:

1.准备数据

  • 获取自变量(浓度)和因变量(吸光度)的数据,存储为两个列表

    concentrations = [0.1, 0.2, 0.3, 0.4, 0.5]
    absorbances = [0.5, 1.0, 1.5, 2.0, 2.5]
    

2.计算均值

  • 分别计算自变量和因变量的均值

    mean_concentration = sum(concentrations) / len(concentrations)
    mean_absorbance = sum(absorbances) / len(absorbances)
    

3.计算斜率和截距

  • 计算斜率 slope:使用公式 ∑ ( ( x − m e a n ( x ) ) ∗ ( y − m e a n ( y ) ) ) / ∑ ( ( x − m e a n ( x ) ) 2 ) \sum ((x - mean(x)) * (y - mean(y))) / \sum ((x - mean(x))^2) ((xmean(x))(ymean(y)))/((xmean(x))2)

  • 计算截距 intercept:使用公式 m e a n ( y ) − s l o p e ∗ m e a n ( x ) mean(y) - slope * mean(x) mean(y)slopemean(x)

    numerator = sum([(x - mean_concentration) * (y - mean_absorbance) for x, y in zip(concentrations, absorbances)])
    denominator = sum([(x - mean_concentration) ** 2 for x in concentrations])
    
    slope = numerator / denominator
    intercept = mean_absorbance - slope * mean_concentration
    

4.计算预测值

  • 使用得到的斜率和截距,对每个浓度值进行预测,得到对应的预测吸光度值

    predicted_absorbances = [slope * x + intercept for x in concentrations]
    

5.计算相关系数

  • 计算预测吸光度值的均值

  • 计算回归平方和 ssr:对每个预测吸光度值,计算其与预测吸光度均值之差的平方,并将所有平方差相加

  • 计算总平方和 sst:对每个实际吸光度值,计算其与实际吸光度均值之差的平方,并将所有平方差相加

  • 将 ssr 除以 sst,得到相关系数 r_value

    mean_predicted_absorbance = sum(predicted_absorbances) / len(predicted_absorbances)
    
    ssr = sum((pred_y - mean_predicted_absorbance) ** 2 for pred_y in predicted_absorbances)
    sst = sum((true_y - mean_absorbance) ** 2 for true_y in absorbances)
    
    r_value = ssr / sst
    

完整的代码如下:

# 假设有浓度和吸光度的数据列表
concentrations = [0.1, 0.2, 0.3, 0.4, 0.5]
absorbances = [0.5, 1.0, 1.5, 2.0, 2.5]

# 计算均值
mean_concentration = sum(concentrations) / len(concentrations)
mean_absorbance = sum(absorbances) / len(absorbances)

# 计算斜率和截距
numerator = sum([(x - mean_concentration) * (y - mean_absorbance) for x, y in zip(concentrations, absorbances)])
denominator = sum([(x - mean_concentration) ** 2 for x in concentrations])

slope = numerator / denominator
intercept = mean_absorbance - slope * mean_concentration

# 预测吸光度值
predicted_absorbances = [slope * x + intercept for x in concentrations]

# 计算相关系数 r_value
mean_predicted_absorbance = sum(predicted_absorbances) / len(predicted_absorbances)

ssr = sum((pred_y - mean_predicted_absorbance) ** 2 for pred_y in predicted_absorbances)
sst = sum((true_y - mean_absorbance) ** 2 for true_y in absorbances)

r_value = ssr / sst

print("斜率: ", slope)
print("截距: ", intercept)
print("相关系数 r_value: ", r_value)

通过以上代码,可以计算出线性回归模型的斜率、截距以及相关系数 r_value,从而对浓度和吸光度之间的线性关系进行评估。


线性回归又称为普通最小二乘法(ordinary least squares,OLS),是回归问题最简单也最经典的线性方法。线性回归旨在寻找出最佳的参数 w 和 b,使得对训练集的预测值与真实的回归目标值 y 之间的均方误差最小。均方误差(mean squared error,MSE)是预测值与真实值之差的平方和除以样本数。线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression


# 导入波士顿房价数据集
boston = load_boston()

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=42)

# 实例化 LinearRegression 类对象
lr = LinearRegression()

# 构建模型(通过特征数据和目标值进行拟合)
lr.fit(X_train, y_train)

# 模型预测及模型评估
y_preds = lr.predict(X_test)
R_squared_train = lr.score(X_train, y_train)
R_squared_test = lr.score(X_test, y_test)

print('预测结果:\n', y_preds)
print('R_squared_train:\n', R_squared_train)
print('R_squared_test:\n', R_squared_test)
print('参数 w:\n', lr.coef_)  # 线性回归模型的参数 w 被保存在 coef_ 属性中,有多少个特征就有多少个元素值;返回一个 ndarray
print('参数 b:\n', lr.intercept_)  # 线性回归模型的参数 b 被保存在 intercept_ 属性中;返回一个 numpy.float64
---------
预测结果:
 [28.83885359 36.00783288 15.08324755 25.23090886 18.87864064 23.21398327
 17.5931124  14.30508093 23.05438985 20.62008346 24.78514683 18.66833668
 -6.9788951  21.83575737 19.20898992 26.2868054  20.54379176  5.65713224
 40.42358065 17.64146116 27.32258958 30.05056174 11.15013704 24.11530393
 17.89145648 15.79348591 22.94743453 14.2586068  22.26731194 19.24709013
 22.26897546 25.24344002 25.69165643 17.98759507 16.70286649 17.11631225
 31.19643534 20.17835831 23.71828436 24.79196868 13.94575895 32.00389982
 42.53869791 17.44523722 27.15354457 17.07482215 13.89272021 26.06440323
 20.36888769 29.97813037 21.35346608 34.32287916 15.88498671 26.17757739
 39.50970314 22.84123308 18.95049088 32.68913818 25.02057949 12.90539147
 22.76052302 30.53884316 31.60797905 15.92162168 20.50670563 16.50798147
 20.50202198 26.00723901 30.63860954 11.42877835 20.53765181 27.56249175
 10.85162601 15.96871769 23.87570192  5.66369672 21.47818991 41.2820034
 18.56559986  9.08857252 20.97848452 13.0630057  20.99054395  9.34050291
 23.13686588 31.80106627 19.10245917 25.59186169 29.14490119 20.17571514
 25.5962149   5.20301905 20.16835681 15.08546746 12.8601543  20.80904894
 24.68556943 -0.77450939 13.33875673 15.62703156 22.21755358 24.58188737
 10.77302163 19.50068376 23.23450396 11.77388822 18.36777924 25.4383785
 20.89079232 24.08440617  7.3658717  19.16424347 21.93734133 27.41191713
 32.50857196 14.86885244 35.05912525 12.86075113 20.83043572 28.42077138
 15.65853688 24.67196362  3.28420892 23.79879617 25.73329894 23.04815612
 24.73046824]
R_squared_train:
 0.748087259862344
R_squared_test:
 0.6844267283527105
参数 w:
 [-1.28322638e-01  2.95517751e-02  4.88590934e-02  2.77350326e+00
 -1.62388292e+01  4.36875476e+00 -9.24808158e-03 -1.40086668e+00
  2.57761243e-01 -9.95694820e-03 -9.23122944e-01  1.31854199e-02
 -5.17639519e-01]
参数 b:
 29.83642016383869

岭回归(Ridge Regression)是一种用于处理线性回归问题的正则化方法。它通过引入一个正则化项来控制模型的复杂度,从而减少过拟合的风险。

在普通的线性回归中,我们试图找到最小化预测值与实际观测值之间差异的模型参数。然而,在样本量相对较小或特征之间存在多重共线性(即特征之间高度相关)的情况下,普通线性回归可能会出现过拟合的问题。

岭回归也是一种用于回归的线性模型,因此它的预测公式与普通最小二乘法相同。但在岭回归中,对系数(w)的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加约束,我们还希望系数尽量小。换句话说,w 的所有元素都应接近于 0。直观上来看,这意味着每个特征对输出的影响应尽可能小(即斜率很小),同时仍能给出很好的预测结果。这种约束是所谓正则化(regularization)的一个例子。

岭回归通过在目标函数中添加一个正则化项,来约束模型参数的大小。这个正则化项是基于 L2 范数(又称为欧几里德范数)计算的,它是所有参数的平方和的平方根。岭回归的目标函数可以表示为:
J ( β ) = S S R ( β ) + α ∗ ∣ ∣ β ∣ ∣ 2 J(β) = SSR(β) + α * ||β||² J(β)=SSR(β)+α∣∣β2
其中, J ( β ) J(β) J(β) 是岭回归的目标函数, S S R ( β ) SSR(β) SSR(β) 是残差平方和, α α α 是正则化参数, ∣ ∣ β ∣ ∣ 2 ||β||² ∣∣β2 是参数 β β β 的 L2 范数的平方。

通过引入正则化项,岭回归可以在最小化残差平方和的同时,限制参数的大小,从而降低了过拟合的风险。当 α α α 的取值较大时,正则化项的影响较大,模型的参数会更加收缩,对模型的约束会更强;当 α α α 的取值较小时,正则化项的影响较小,模型的参数会逐渐趋近于普通线性回归的参数。

岭回归可以通过最小二乘法或梯度下降等方法进行求解。在实践中,通常会使用交叉验证来选择最优的正则化参数 α α α,从而得到更好的模型性能。

Ridge模型在模型的简单性(系数都接近于0)与训练集性能之间做出权衡。简单性和训练集性能二者对于模型的重要程度可以由用户通过设置alpha参数来指定。

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge


# 导入波士顿房价数据集
boston = load_boston()

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=42)

# 实例化 Ridge 类对象
ridge = Ridge()

# 构建模型(通过特征数据和目标值进行拟合)
ridge.fit(X_train, y_train)

# 模型预测及模型评估
y_preds = ridge.predict(X_test)
R_squared_train = ridge.score(X_train, y_train)
R_squared_test = ridge.score(X_test, y_test)

print('预测结果:\n', y_preds)
print('R_squared_train:\n', R_squared_train)
print('R_squared_test:\n', R_squared_test)
print('参数 w:\n', ridge.coef_)  # 岭回归模型的参数 w 被保存在 coef_ 属性中,有多少个特征就有多少个元素值;返回一个 ndarray
print('参数 b:\n', ridge.intercept_)  # 岭回归模型的参数 b 被保存在 intercept_ 属性中;返回一个 numpy.float64
---------
预测结果:
 [28.54064867 35.71551744 14.42009815 25.04814058 19.20234452 22.35320449
 17.52750631 14.17684204 22.18499979 20.76195907 24.06170559 18.52148362
 -7.18864146 21.20513043 19.19166506 26.13388324 20.16549065  5.54695316
 40.34571749 17.91815854 27.5481662  29.93665643 11.20500881 24.57464556
 18.1888637  15.1181412  22.41851475 14.46895295 21.53062635 19.48957221
 21.83517015 25.4260258  25.69271188 18.78119269 15.9756706  18.41368915
 31.18077354 20.76445709 23.26457957 24.58355668 14.04176364 31.91298129
 42.37339182 17.16763115 27.0516969  17.22846544 13.96361484 25.87064036
 19.83569122 30.25881706 21.25169572 34.1522766  16.00749082 26.25113993
 39.76924876 22.72399595 19.40186461 32.77846975 24.93946917 12.66989306
 23.1287835  30.99910855 31.77003921 16.43730279 20.95565665 15.62086327
 20.58563733 26.003086   30.88371223 11.65245539 20.37555917 26.91376992
 11.17278687 16.94107775 23.22575291  5.6122086  21.30391516 41.09192897
 18.42866519  8.29767158 20.79920867 12.2118323  21.10316066  9.34768714
 23.01216209 31.43317033 19.44074609 25.88776492 28.88705549 20.20937707
 25.6009495   5.05862823 20.29479664 15.1544001  13.28990303 20.95396913
 24.35627873 -1.80657178 13.73769646 14.81477461 22.0569083  24.00492861
 10.18967741 20.06100921 23.29196718 11.15224571 18.72212607 25.98221929
 21.66393608 24.4587186   7.5681605  18.41656824 22.75983577 27.342632
 32.25543486 15.14502384 34.92541697 13.07359921 21.15193156 28.3531952
 15.47899144 24.9470332   3.3783654  23.5617825  25.94235972 23.25353503
 25.10125732]
R_squared_train:
 0.7461161787884156
R_squared_test:
 0.6789748327846077
参数 w:
 [-0.12383039  0.03139178  0.01767668  2.54277179 -8.77249222  4.37980204
 -0.01537349 -1.29086084  0.24406848 -0.01082435 -0.83346553  0.01348642
 -0.53435396]
参数 b:
 24.878370472969365

Lasso(Least Absolute Shrinkage and Selection Operator)算法也是一种用于处理线性回归问题的正则化方法。与岭回归类似,它也通过引入一个正则化项来控制模型的复杂度,从而减少过拟合的风险。但与岭回归不同的是,Lasso 使用的是 L1 范数来计算正则化项。

Lasso 通过在目标函数中添加一个正则化项,来约束模型参数的大小。这个正则化项是基于 L1 范数(又称为曼哈顿范数)计算的,它是所有参数的绝对值之和。Lasso 的目标函数可以表示为:

J ( β ) = S S R ( β ) + α ∗ ∣ ∣ β ∣ ∣ 1 J(β) = SSR(β) + α * ||β||₁ J(β)=SSR(β)+α∣∣β1

其中, J ( β ) J(β) J(β) 是 Lasso 的目标函数, S S R ( β ) SSR(β) SSR(β) 是残差平方和, α α α 是正则化参数, ∣ ∣ β ∣ ∣ 1 ||β||₁ ∣∣β1 是参数 β β β 的 L1 范数。

与岭回归不同的是,Lasso 的正则化项会将一些参数压缩为零,从而实现了特征选择的功能。L1 正则化的结果是,使用 Lasso 时某些系数刚好为 0,这说明某些特征被模型完全忽略,这可以看作是一种自动化的特征选择。某些系数刚好为 0,这样模型更容易解释,也可以呈现模型最重要的特征。简单地说,Lasso 可以自动地从所有的特征中找出对目标变量最重要的特征,并将其它特征的系数缩小或压缩为零,从而实现模型的稀疏性。

from sklearn.linear_model import Lasso

lasso = Lasso(alpha=0.01, max_iter=10000)
lasso.fit(X_train, y_train)
y_pred = lasso.predict(X_new)

alpha 值变小,我们可以拟合一个更复杂的模型,但如果把 alpha 设得太小,那么就会消除正则化的效果,并出现过拟合,得到与 LinearRegression 类似的结果。

在实践中,在岭回归和 Lasso 两个模型中一般首选岭回归。但如果特征很多,你认为只有其中几个是重要的,那么选择 Lasso 可能更好。同样,如果你想要一个容易解释的模型,Lasso 可以给出更容易理解的模型,因为它只选择了一部分输入特征。scikit-learn 还提供了 ElasticNet 类,结合了 Lasso 和 Ridge 的惩罚项。在实践中,这种结合的效果最好,不过代价是要调节两个参数:一个用于 L1 正则化,一个用于 L2 正则化。


线性模型的主要参数是正则化参数,在回归模型中叫作alpha,在LinearSVC和Logistic-Regression中叫作C。alpha值较大或C值较小,说明模型比较简单。特别是对于回归模型而言,调节这些参数非常重要。通常在对数尺度上对C和alpha进行搜索。你还需要确定的是用L1正则化还是L2正则化。如果你假定只有几个特征是真正重要的,那么你应该用L1正则化,否则应默认使用L2正则化。如果模型的可解释性很重要的话,使用L1也会有帮助。由于L1只用到几个特征,所以更容易解释哪些特征对模型是重要的,以及这些特征的作用。

线性模型的训练速度非常快,预测速度也很快。这种模型可以推广到非常大的数据集,对稀疏数据也很有效。如果你的数据包含数十万甚至上百万个样本,你可能需要研究如何使用LogisticRegression和Ridge模型的solver='sag’选项,在处理大型数据时,这一选项比默认值要更快。

线性模型的另一个优点在于,利用我们之间见过的用于回归和分类的公式,理解如何进行预测是相对比较容易的。不幸的是,往往并不完全清楚系数为什么是这样的。如果你的数据集中包含高度相关的特征,这一问题尤为突出。在这种情况下,可能很难对系数做出解释。

如果特征数量大于样本数量,线性模型的表现通常都很好。它也常用于非常大的数据集,只是因为训练其他模型并不可行。但在更低维的空间中,其他模型的泛化性能可能更好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值