机器学习-线性回顾

线性回归

  • 线性回归
    • [1. 简介](#1. 简介)
    • [2. 线性回归问题求解](#2. 线性回归问题求解)
    • [3. 欠拟合与过拟合](#3. 欠拟合与过拟合)

线性回归

1. 简介

python 复制代码
"""
简介:
	定义:
		利用回归方程对一个或多个自变量(特征值)和因变量(目标值)之间关系 进行建模的一种分析方式
	公式:
		见下图
	分类:
		一元线性回归:
			目标值与一个因变量有关系
		多远线性回归:
			目标值与多个因变量有关系
"""

线性回归公式. 见下图

2. 线性回归问题求解

python 复制代码
"""
线性回归API:
	from sklearn.linear_model import LinearRegression

损失函数:
	误差概念:
		用预测值y-真实值y = 误差
	衡量每个样本预测值与真实值效果的函数
		代价函数, 成本函数, 目标函数
	种类:
		均方误差 MSE
		平均绝对误差 MAE
		均方根误差 RMSE
正规方程法:
	线性回归最小而成损失函数
		J(w)= ||Xw−y||₂² 取值最小
"""
# 1.导入依赖包
# from sklearn.datasets import load_boston # 数据集已废弃
from sklearn.preprocessing import StandardScaler  # 特征处理
from sklearn.model_selection import train_test_split  # 数据集划分
from sklearn.linear_model import LinearRegression  # 正规方程的回归模型
from sklearn.linear_model import SGDRegressor  # 梯度下降的回归模型
from sklearn.metrics import mean_squared_error  # 均方误差评估
from sklearn.linear_model import Ridge, RidgeCV
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

import warnings
warnings.filterwarnings('ignore')

# 正规方程法
def linearRegr():
    """
    正规方程法
    :return:
    """
    # 2.数据预处理
    # 2.1 获取数据
    data_url = "http://lib.stat.cmu.edu/datasets/boston"
    raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
    data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    target = raw_df.values[1::2, 2]
    # 2.2 数据集划分
    x_train, x_test, y_train, y_test = train_test_split(data, target, random_state=22)
    # 2.3 特征工程-标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 3.模型训练,机器学习-线性回归
    # 3.1 实例化模型(正规方程)
    estimator = LinearRegression()
    # 3.2 模型训练
    estimator.fit(x_train, y_train)
    # 4.模型预测
    y_predict = estimator.predict(x_test)
    print("预测值为:", y_predict)
    print("模型的权重系数为:", estimator.coef_)
    # 5.模型评估,均方误差
    error = mean_squared_error(y_test, y_predict)
    print("误差为:", error)
python 复制代码
"""
梯度下降法:
	梯度:
		单变量函数中:
			梯度就是某一点的切线的斜率
			梯度的方向为函数增长最快的方向
		多变量函数中:
			梯度就是某一个点的偏导数
			有方向: 偏导数分量的向量方向
	沿着梯度下降的方向求解极小值
	公式:
		见下图
		α: 学习率(步长)不能太大,也不能太小. 机器学习中:0.001~0.01
		梯度是上升最快的方向, 我们需要是下降最快的方向, 所以需要加负号
	
	梯度下降优化过程:
		1. 给定初始位置 步长(学习率)
		2. 计算该点当前的梯度的负方向
		3. 向该负方向移动步长
			步长决定了在梯度下降迭代过程中, 每一步沿梯度负方向前进的长度
			学习率太小,下降的速度会慢
			学习率太大, 容易造成错过最低点, 产生下降过程中的震荡,甚至梯度爆炸
		4. 重复 2-3 步直至收敛
			两次差距小于指定的阈值
			达到指定的迭代次数
	梯度下降法分类:
		全体度下降算法 FGD
			每次迭代时, 使用全部样本的梯度值
				特点: 训练速度较慢
		随机梯度下降算法 SGD
			每次迭代时, 随机选择并使用一个样本梯度值
				特点: 简单,高效,不稳定
		小批量梯度下降算法 mini-batch
			每次迭代时, 随机选择并使用小批量的样本梯度值
				特点: 表现也正好居于SG 和FG 二者之间
		随机平均梯度下降算法 SAG
			每次迭代时, 随机选择一个样本的梯度值和以往样本的梯度值的均值
				特点: 训练初期表现不佳,优化速度较慢	
"""
from sklearn.preprocessing import StandardScaler  # 特征处理
from sklearn.model_selection import train_test_split  # 数据集划分
from sklearn.linear_model import LinearRegression  # 正规方程的回归模型
from sklearn.linear_model import SGDRegressor  # 梯度下降的回归模型
from sklearn.metrics import mean_squared_error  # 均方误差评估
from sklearn.linear_model import Ridge, RidgeCV
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 梯度下降法
def SGDRegr():
    """
    梯度下降法
    :return:
    """
    # 2.数据预处理
    # 2.1 获取数据
    data_url = "http://lib.stat.cmu.edu/datasets/boston"
    raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
    data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    target = raw_df.values[1::2, 2]
    # 2.2 数据集划分
    x_train, x_test, y_train, y_test = train_test_split(data, target, random_state=22)
    # 2.3 特征工程-标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 3.模型训练,机器学习-线性回归
    # 3.1 实例化模型(梯度下降法)
    estimator = SGDRegressor()
    # estimator = SGDRegressor(max_iter=1000, learning_rate="constant", eta0=0.001)
    # 3.2 模型训练
    estimator.fit(x_train, y_train)
    # 4.模型预测
    y_predict = estimator.predict(x_test)
    print("预测值为:", y_predict)
    print("模型的权重系数为:", estimator.coef_)
    print("模型的偏置为:", estimator.intercept_)
    # 5.模型评估, 均方误差
    error = mean_squared_error(y_test, y_predict)
    print("误差为:", error)

梯度下降法, 公式见下图

3. 欠拟合与过拟合

python 复制代码
"""
欠拟合与过拟合
	欠拟合:
		模型在训练集上表现不好,在测试集上也表现不好。模型过于简单
		出现原因
			学习到数据的特征过少
		解决方法
			添加其他特征
			添加多项式特征项
	过拟合:
		模型在训练集上表现好,在测试集上表现不好。模型过于复杂
		出现原因
			原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
		解决方法
			重新清洗数据
			增大数据的训练量
			正则化
			减少特征维度,防止维灾难
"""
def underFitting():
    """
    欠拟合
    :return:
    """
    # 2.准备数据x y(增加上噪声)
    np.random.seed(666)
    x = np.random.uniform(-3, 3, size=100)
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
    # 3 训练模型
    # 3.1 实例化线性回归模型
    estimator = LinearRegression()
    # 3.2 模型训练
    X = x.reshape(-1, 1)
    estimator.fit(X, y)
    # 4 模型预测
    y_predict = estimator.predict(X)
    # 5 模型评估,计算均方误差
    # 5.1 模型评估MSE
    myret = mean_squared_error(y, y_predict)
    print('myret-->', myret)
    # 5.2 展示效果
    plt.scatter(x, y)
    plt.plot(x, y_predict, color='r')
    plt.show()


def fitting():
    """
    拟合
    :return:
    """
    # 2.准备数据x y(增加上噪声)
    np.random.seed(666)
    x = np.random.uniform(-3, 3, size=100)
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
    # 3.模型训练
    # 3.1 实例化线性回归模型
    estimator = LinearRegression()
    # 3.2 模型训练
    X = x.reshape(-1, 1)
    # print('X.shape-->', X.shape)
    X2 = np.hstack([X, X ** 2])  # 数据增加二次项
    estimator.fit(X2, y)
    # 4.模型预测
    y_predict = estimator.predict(X2)
    # 5.模型评估,计算均方误差
    myret = mean_squared_error(y, y_predict)
    print('myret-->', myret)
    # 6 展示效果
    plt.scatter(x, y)
    # 画图plot折线图时 需要对x进行排序, 取x排序后对应的y值
    plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
    plt.show()


def overFitting():
    """
    过拟合
    :return:
    """
    # 2.准备数据x y(增加上噪声)
    np.random.seed(666)
    x = np.random.uniform(-3, 3, size=100)
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
    # 3 训练模型
    # 3.1 实例化线性回归模型
    estimator = LinearRegression()
    # 3.2 模型训练
    X = x.reshape(-1, 1)
    # print('X.shape-->', X.shape)
    X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10])  # 数据增加高次项
    estimator.fit(X3, y)
    # 4.模型预测
    y_predict = estimator.predict(X3)
    # 5.模型评估,计算均方误差
    # 5.1 模型评估MSE
    myret = mean_squared_error(y, y_predict)
    print('myret-->', myret)
    # 5.2 展示效果
    plt.scatter(x, y)
    # 画图时输入的x数据: 要求是从小到大
    plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
    plt.show()
python 复制代码
"""
正则化:
		在模型训练时,数据中有些特征影响模型复杂度、或者某个特征的异常值较多,所以要尽量减少这个特征的影响(甚至删除某个特征的影响)
		L1正则化
			α 叫做惩罚系数,该值越大则权重调整的幅度就越大,即:表示对特征权重惩罚力度就越大
			L1 正则化会使得权重趋向于 0,甚至等于 0,使得某些特征失效,达到特征筛选的目的
			from sklearn.linear_model import Lasso
		L2正则化
			α 叫做惩罚系数,该值越大则权重调整的幅度就越大,即:表示对特征权重惩罚力度就越大
			L2 正则化会使得权重趋向于 0,一般不等于 0
			from sklearn.linear_model import Ridge
"""

# 1.导入依赖包
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler  # 特征处理
from sklearn.model_selection import train_test_split  # 数据集划分
from sklearn.linear_model import LinearRegression  # 正规方程的回归模型
from sklearn.linear_model import SGDRegressor  # 梯度下降的回归模型
from sklearn.metrics import mean_squared_error  # 均方误差评估
from sklearn.linear_model import Ridge, RidgeCV
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

def L1Regular():
    """
    L1 正则化
    :return:
    """
    # 2.准备数据x y(增加上噪声)
    np.random.seed(666)
    x = np.random.uniform(-3, 3, size=100)
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
    # 3 训练模型
    # 3.1 实例化L1正则化模型 做实验:alpha惩罚力度越来越大,k值越来越小,返回会欠拟合
    estimator = Lasso(alpha=0.1)
    # 3.2 模型训练
    X = x.reshape(-1, 1)
    X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10])  # 数据增加二次项
    estimator.fit(X3, y)
    print('estimator.coef_', estimator.coef_)
    # 4.模型预测
    y_predict = estimator.predict(X3)
    # 5.模型评估,计算均方误差
    # 5.1 模型评估MSE
    myret = mean_squared_error(y, y_predict)
    print('myret-->', myret)
    # 5.2 展示效果
    plt.scatter(x, y)
    # 画图时输入的x数据: 要求是从小到大
    plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
    plt.show()


# 1.导入依赖包
from sklearn.linear_model import Ridge


def L2Regular():
    """
    L2 正则化
    :return:
    """
    # 2.准备数据x y(增加上噪声)
    np.random.seed(666)
    x = np.random.uniform(-3, 3, size=100)
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
    # 3.训练模型
    # 3.1 实例化L2正则化模型
    estimator = Ridge(alpha=0.1)
    # 3.2 模型训练
    X = x.reshape(-1, 1)
    X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10])  # 数据增加二次项
    estimator.fit(X3, y)
    print('estimator.coef_', estimator.coef_)
    # 4.模型预测
    y_predict = estimator.predict(X3)
    # 5.模型评估,计算均方误差
    # 5.1 模型评估,MSE
    myret = mean_squared_error(y, y_predict)
    print('myret-->', myret)
    # 5.2 展示效果
    plt.scatter(x, y)
    # 画图时输入的x数据: 要求是从小到大
    plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
    plt.show()

L1正则化, 公式为

L2正则化, 公式为

相关推荐
MaybeAI4 分钟前
Skill 与 Workflow:让自动化更“聪明”的系统架构
人工智能·ai·自动化·workflow·工作流
唯道行9 分钟前
计算机图形学·9 几何学
人工智能·线性代数·计算机视觉·矩阵·几何学·计算机图形学
Antonio91512 分钟前
【图像处理】tiff格式介绍
图像处理·人工智能
AndrewHZ15 分钟前
【图像处理基石】什么是alpha matting?
图像处理·人工智能·计算机视觉·matting·发丝分割·trimap·人像模式
慕云紫英28 分钟前
人工智能在全球多领域的应用潜力及当前技术面临的挑战
人工智能·aigc
“向阳的蛋”32 分钟前
生老病死(一)
人工智能·ai
流烟默36 分钟前
机器学习中模型的鲁棒性是什么
人工智能·机器学习·鲁棒性
粉色挖掘机37 分钟前
矩阵在密码学的应用——希尔密码详解
线性代数·算法·机器学习·密码学
Baihai_IDP1 小时前
并行智能体是否将重塑软件开发模式?
人工智能·程序员·ai编程
飞哥数智坊1 小时前
当你还在用 AI 写周报,别人的 AI 已经在炒币炒股了
人工智能