机器学习中的正则化&拟合

正则化&拟合

    • 一 正则化
      • 1.1 概述
      • 1.2 分类
        • 1.2.1 L1正则化
        • 1.2.2 L2正则化
    • 二 拟合
      • 2.1 概述
      • 2.2 分类
        • 2.2.1 欠拟合
        • 2.2.2 过拟合
        • 2.2.3 正好拟合

	在算法中我们可以通过算法的时间复杂度和空间复杂度来评估算法的好坏。那在机器学习中如何判断一个模型的优劣呢?
此时我们就需要观察模型拟合(当然还会用到模型评估时的各种指标今天不聊),当出现了不同的拟合情况又将如何解决呢?
正则化就是一个不错的选择。有了这个基本思路跟着小编进入今天的分享,我们先从正则化说起。

一 正则化

1.1 概述

在机器学习中数据提供的特征有些影响模型复杂度(或者这个特征的数据点异常较多),所以算法在学习的时候尽量减少这个特征的影响(有时甚至删除某个特征的影响),这个过程就是正则化。

1.2 分类

1.2.1 L1正则化

L1正则化会使得特征的权重变为0, 一般适用于: 特征选取。

# 代码模拟L1正则化

# 0.导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression   # 线性回归-正规方程模型
from sklearn.metrics import mean_squared_error      # 计算均方误差
from sklearn.linear_model import Lasso              # L1正则化

def dm_L1正则化():
    # 1.准备数据
    # 准备噪声(简单理解为随机种子),噪声相同 每次生成的随机点数相同(噪声点形成的图相同)
    np.random.seed(21)
    # x 表示特征 -3-3之间 随机的小数 生成100个
    x = np.random.uniform(-3, 3, size=100)
    # y 表示标签(目标值) 存在线性关系 y=0.5x² + x +2 + 正态分布 + 噪声
    # np.random.normal(0,1,size=100) 意思是均值为0 标准差为1 生成100个
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
    # 模型训练
    # 2.创建线性回归-L1正则化 模型对象
    estimator = Lasso(alpha=0.1) # alpha : 阿尔法 正则化参数 值越大正则化程度越高 权重值越小 越可能变成0
    # 3.对数据集做处理
    # 3.1把数据从一维数据=>2维数据
    X = x.reshape(-1, 1)
    # 3.2 拼接x 和 x的平方 把数据从[[1],[2],[3]] => [[1,1,1...],[2,4,8,16..],[3,9,27,81..]] 即一元线性回归=>二元线性回归
    X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10])
    # 4.模型训练
    estimator.fit(X3, y)  # 传入处理后的X值
    # 5. 模型预测
    y_predict = estimator.predict(X3)
    print(f'预测结果为:{
     y_predict}')
    # 6.模型评估
    print(f'均方误差{
     mean_squared_error(y, y_predict)}')
    # 7. 数据可视化绘制图像
    plt.scatter(x, y)  # 基于原始的x(特征),y(真实值)绘制散点图
    # np.sort(x) 按照x值的升序排列
    # np.argsort(x) 按照x值的升序排列 返回(x对应的)索引值
    plt.plot(np.sort(x), y_predict[np.argsort(x)], c='r')  # 基于原始的x(特征)y(预测值)绘制折线图(即 拟合回归线)
    plt.show()
    
if __name__ == '__main__'

你可能感兴趣的:(机器学习,人工智能)