线性回归
线性回归算法是一种用于建立变量之间线性关系模型的统计方法。它在数据分析、机器学习和预测建模等领域中被广泛应用。
一、基本原理
线性回归的目标是找到一条直线(在一元线性回归中)或一个超平面(在多元线性回归中),使得数据点到该直线或超平面的距离之和最小。这个距离通常使用残差平方和来度量。
二、求解方法
- 最小二乘法
最小二乘法是线性回归中最常用的求解方法。它通过最小化残差平方和来确定模型的参数。
对于一元线性回归,通过求解方程组可以得到参数和的估计值。
对于多元线性回归,可以使用矩阵运算来求解参数。
- 梯度下降法
梯度下降法是一种迭代优化算法,用于求解最小化问题。
在线性回归中,通过不断调整参数,使得残差平方和逐渐减小。
梯度下降法可以用于大规模数据集的求解,但需要选择合适的学习率和迭代次数。
三、评估指标
- 均方误差(MSE)
均方误差是线性回归中常用的评估指标之一。它计算预测值与真实值之间的平均平方误差。
MSE 越小,说明模型的预测效果越好。
- 决定系数(R²)
决定系数用于衡量模型对数据的拟合程度。它表示因变量的变化中可以由自变量解释的比例。
R² 的取值范围在 0 到 1 之间,越接近 1 说明模型的拟合效果越好。
四、应用场景
- 预测
线性回归可以用于预测因变量的值,例如房价预测、销售预测等。
- 变量关系分析
通过线性回归可以分析自变量与因变量之间的关系,判断自变量对因变量的影响程度。
- 数据拟合
线性回归可以对数据进行拟合,找到数据的趋势和规律。
五、注意事项
- 线性假设
线性回归假设自变量与因变量之间存在线性关系。如果实际数据不满足线性假设,可能需要进行数据转换或使用其他非线性模型。
- 多重共线性
当自变量之间存在高度相关性时,可能会出现多重共线性问题。这会导致参数估计不准确,影响模型的稳定性和预测能力。
可以通过计算方差膨胀因子(VIF)等方法来检测多重共线性,并采取相应的处理措施,如删除相关变量、进行主成分分析等。
- 异常值和离群点
异常值和离群点可能会对线性回归模型产生较大影响。在进行分析之前,需要对数据进行检查和处理,去除异常值或对其进行适当的处理。
- 数据规模和质量
线性回归需要足够的数据量来保证模型的准确性和稳定性。同时,数据的质量也很重要,包括数据的准确性、完整性和一致性等。
一元线性回归
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
boston = datasets.load_boston()
print(boston)
x = boston.data[:,5]#5代表数据集中的第六个特征
y = boston.target
#发现y的值再50 有很多,数据有问题,以为以最大50,所以令y<50
x = x[y<50]
y = y[y<50]
plt.scatter(x,y)
plt.show()
#对数据集进行划分
from sklearn.model_selection import train_test_split
#数据集按7:3划分为训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.3,random_state = 233)
plt.scatter(x_train,y_train)
plt.show()
#编写模型进行训练
def fit(x,y):
a_up = np.sum((x-np.mean(x))*(y-np.mean(y)))
a_bottom = np.sum((x-np.mean(x))**2)
a = a_up/a_bottom
b = np.mean(y)-a *np.mean(x)
return a,b
a,b = fit(x_train,y_train)
plt.scatter(x_train,y_train)
plt.plot(x_train,a*x_train+b,c='r')
plt.show()
#图片拟合训练集
#看是否拟合测试集
plt.scatter(x_test,y_test)
plt.plot(x_test,a*x_test+b,c='r')
plt.show()
用sklearn实现一元线性回归
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
y_predict = lin_reg.predict(x_test.reshape(-1,1))
plt.scatter(x_test,y_test)
plt.plot(x_test,y_predict,c = 'r')
plt.show()
sklearn实现多元线性回归
x = boston.data
y = boston.target
x = x[y<50]
y = y[y<50]
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.3,random_state=233)
lin_reg.fit(x_teain,y_train)
lin_reg.score(x_test,y_test)
归一化??
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
standardScaler.fit(x_train)
x_train = standardScaler.transform(x_train)
x_text = standardScaler.transform(x_text)
lin_reg.fit(x_teain,y_train)
lin_reg.score(x_test,y_test)
#归一化的结果和不做归一化一样,因为多元线性回归攫取的是每一位特征值的权重,归不归一化结果一样