线性回归算法

定义

线性回归(Linear regression)是利⽤回归⽅程(函数)对⼀个或多个⾃变量(特征值)和因变量(⽬标值)之间关系进⾏建模的⼀种分析⽅式。

只有一个自变量叫单变量回归;多于一个叫多元回归

 

 线性回归API简单使用
from	sklearn.linear_model	import	LinearRegression

# 获取数据集
x = [[80, 86],
     [82, 80],
     [85, 78],
     [90, 90],
     [86, 82],
     [82, 90],
     [78, 80],
     [92, 94]]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]

# 数据基本处理(该案例中省略)
# 特征工程(该案例中省略)

# 模型训练
estimator = LinearRegression()
estimator.fit(x,y)


# 模型评估(该案例中省略)
# 打印对应系数
print("线性回归的系数是\n", estimator.coef_)
print("输出预测结果\n", estimator.predict([[100,80]]))
数学:求导

学过,不再一一说明

 

 线性回归的损失和优化
损失函数

 优化算法

1、正规方程

 原理:要优化,就要找到一个w,使得损失函数最小,就是求导,令导数等于0,所对应的那个w就是损失函数最小时的w

 

 2、梯度下降

在单变量的函数中,梯度是函数的微分,代表着函数在某个给定点的切线的斜率

在单变量的函数中,梯度是一个向量,它的方向指出了函数在给定点的上升最快的方向

公式

 α:步长/学习率:通过α来控制每一步走的距离,确保不要走太快,以免步子太大扯着蛋(bushi),错过了最低点;同时也不能走太慢。所以应该选择一个合适的α(prominent)

并不一定确保找到最小值     局部最优

小结

 梯度下降(详细)

1、先决条件:确认优化模型的假设函数和损失函数

2、相关参数初始化

3、算法过程

(1)确定当前位置的损失函数梯度

(2)用步长乘以当前损失函数的梯度,得到当前位置下降的距离

(3)确定是否所有的θ对应的梯度下降的距离都小于算法终止距离,如果都小于,算法终止,否则,更新所有θ

 ……

案例分析

正规方程实现

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

def linear_model():
    # 获取数据
    housing = fetch_california_housing()
    # 数据基本处理   分割数据
    x_train, x_test, y_train, y_test = train_test_split(housing.data, housing.target, test_size=0.2)

    # 特征工程  标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)

    # 机器学习  线性回归(正规方程)
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)

    print("模型偏置:\n",estimator.intercept_)
    print("模型系数:\n",estimator.coef_)
    # 模型评估
    y_pre = estimator.predict(x_test)
    print("预测值:\n",y_pre)
    ret = mean_squared_error(y_test, y_pre)  # 均方误差
    print("均方误差:\n", ret)

linear_model()

梯度下降实现

 

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.metrics import mean_squared_error

def linear_model():
    # 获取数据
    housing = fetch_california_housing()
    # 数据基本处理   分割数据
    x_train, x_test, y_train, y_test = train_test_split(housing.data, housing.target, test_size=0.2)

    # 特征工程  标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)

    # 机器学习  线性回归(梯度下降)
    estimator = SGDRegressor(max_iter=10000)
    estimator.fit(x_train, y_train)

    print("模型偏置:\n",estimator.intercept_)
    print("模型系数:\n",estimator.coef_)
    # 模型评估
    y_pre = estimator.predict(x_test)
    print("预测值:\n",y_pre)
    ret = mean_squared_error(y_test, y_pre)  # 均方误差
    print("均方误差:\n", ret)

linear_model()
 过拟合和欠拟合

欠拟合:在训练数据上不能很好的拟合,在测试数据上也不能很好的拟合数据(模型太简单了)

原因:学习到数据的特征过少

解决:添加其他特征项、添加多项式特征

过拟合:在训练数据上能够得到一个很好的拟合,但是在测试数据上却不能很好的拟合数据(模型太复杂了)

原因:原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点

解决:重新清洗数据、增大数据训练量、正则化、减少特征维度

正则化:通过限制高次项来防止模型过拟合

 Ridge回归就是岭回归

正则化线性模型

岭回归

 

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, RidgeCV
from sklearn.metrics import mean_squared_error

def linear_model():
    # 获取数据
    housing = fetch_california_housing()
    # 数据基本处理   分割数据
    x_train, x_test, y_train, y_test = train_test_split(housing.data, housing.target, test_size=0.2)

    # 特征工程  标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)

    # 机器学习  岭回归
    # estimator = Ridge(alpha=1.0)
    estimator = RidgeCV(alphas=(0.001, 0.01, 0.1, 1, 10, 100))
    estimator.fit(x_train, y_train)

    print("模型偏置:\n",estimator.intercept_)
    print("模型系数:\n",estimator.coef_)
    # 模型评估
    y_pre = estimator.predict(x_test)
    print("预测值:\n",y_pre)
    ret = mean_squared_error(y_test, y_pre)  # 均方误差
    print("均方误差:\n", ret)

linear_model()
模型保存加载 
from sklearn.externals import joblib
# 保存
joblib.dump(estimator,'test.pkl')
# 加载
estimator = joblib.load('test.pkl')
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
线性回归算法的发展历程可以追溯到19世纪末。以下是线性回归算法的发展历程: 1. 19世纪末,高尔顿和他的学生K·Pearson观察了1078对夫妇,以每对夫妇的平均身高作为自变量,取他们的一个成年儿子的身高作为因变量。他们发现父母身高和子代身高之间存在近乎一条直线的关系,即回归直线方程为:y^=33.73+0.516x。这是线性回归算法的最早应用之一。 2. 在20世纪初,统计学家卡尔·皮尔逊进一步发展了线性回归算法。他提出了最小二乘法,用于拟合回归直线并估计回归系数。最小二乘法通过最小化残差平方和来确定最佳拟合直线,使得预测值与实际观测值之间的差异最小化。 3. 在20世纪中叶,计算机的发展使得线性回归算法得以广泛应用。计算机的出现使得回归分析的计算更加高效和准确。此时,线性回归算法开始在各个领域得到广泛应用,包括经济学、社会科学、医学等。 4. 随着时间的推移,线性回归算法不断发展和改进。研究人员提出了各种改进的线性回归模型,如多元线性回归、岭回归、lasso回归等。这些改进的模型考虑了更多的因素和变量,提高了模型的预测能力和解释能力。 5. 近年来,随着机器学习和深度学习的兴起,线性回归算法也得到了进一步的发展。线性回归算法被用作其他更复杂模型的基础,如神经网络中的线性层。 总结起来,线性回归算法的发展历程可以追溯到19世纪末,经过了统计学家的研究和改进,以及计算机的发展,逐渐成为一种广泛应用的预测和分析工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值