打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
黑马程序员机器学习Day3学习笔记
userphoto

2023.02.14 北京

关注

线性回归

1.线性回归的原理

回归方程对一个或者多个自变量和因变量之间关系进行建模的一种分析方式

线性模型(关系)

y = w1x1+w2x2+w3x3...+b

只有一个变量的情况,称为单变量回归;多个自变量情况叫做多元回归。

线性模型不一定都是指这样的直线,也可以是弯的。

因为广义线性模型的定义:

1.自变量是一次方(这个是线性模型,线性关系) Y = w1x1 + w2x2 + w3x3 + ... + wnxn + b

2.参数是一次方,参数w是一次,这个是线性模型,但不是线性关系。 因为他的图形形状不是直线。 Y = w1x1 + w2x1^2 + w3x1^3 ... + b


线性关系 & 线性模型

线性关系一定是线性模型

线性模型不一定是线性关系

(可以这么理解,模型的范围 > 关系)


最小二乘法

如何去找到合适的线性模型去表示? 目标:找到合适的参数使得模型预测准确(如何能够找到合适的模型?————损失函数)

线性模型中,比较参数的好坏应该是看点到线性方程的距离.如下图所示,我们根据点到直线的距离作为依据,然后判断这个参数的好坏。

这个距离指标称为:损失函数/cost/成本函数/目标函数

h(x_i) 第i个训练样本特征值组合预测函数

y_i 第i个训练样本数据的真实值

式子也被称为最小二乘法,因为我们需要去找到使得这个损失函数最小的w,因为这个式子有平方,因此我们称这个式子为最小二乘法

正则化

我们知道了指标,具体要怎么做?如何优化 1.正则方程

一步到位,X为特征值矩阵,y为目标值矩阵。

缺点:当特征值过于复杂的时候,因为有求逆的步骤,所以求解的速度很慢。并且可能预测效果没有很好。

2.梯度下降

代码实现

API:

一:正则化方法进行线性回归

Sklearn.linear_model.LinearRegression(fit_intercept=True) fit_intercept=True 是否添加偏置,一般为True,不然回归方程方程只能是通过原点的函数

  • 通过正则方程优化
  • LinearRegreesion.coef_ 回归系数
  • LinearRegression.intercept_ 偏置

步骤:

  1. 获取数据
  2. 划分数据集
  3. 标准化
  4. 预估器
  5. 得出模型
  6. 模型评估
def linear1():
    """
    正规方程的优化方法对波士顿房价进行预测
    :return:
    """
    # 1)获取数据
    boston = load_boston()

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)

    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4)预估器
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)

    # 5)得出模型
    print("正规方程-权重系数为:\n", estimator.coef_)
    print("正规方程-偏置为:\n", estimator.intercept_)

    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("正规方程-均方误差为:\n", error)

    return None


特征有几个,权重系数就有多少个。

二:梯度下降

def linear2():
    """
    梯度下降的优化方法对波士顿房价进行预测
    :return:
    """
    # 1)获取数据
    boston = load_boston()
    print("特征数量:\n", boston.data.shape)

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)

    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4)预估器
    # learning_rate这个参数来选择学习率调整使用什么方法,因为我们希望在斜率大的地方,学习率大点,斜率小的地方,学习率小点。eta0是学习率的初始值。max_iter最大的迭代次数;为了防止过拟合,penalty惩罚项系数。
    estimator = SGDRegressor(learning_rate="constant", eta0=0.01, max_iter=10000, penalty="l1")
    estimator.fit(x_train, y_train)

    # 5)得出模型
    print("梯度下降-权重系数为:\n", estimator.coef_)
    print("梯度下降-偏置为:\n", estimator.intercept_)

    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("梯度下降-均方误差为:\n", error)

    return None


模型性能评估

如何评估一个线性回归方程的性能: 指标:均方误差MSE

和损失函数差不多,就是这个有求一个平均。

梯度下降法和正则法的对比

梯度下降正规方程
需要选择学习率不需要
需要迭代求解一次运算得出
特征数量较大可以使用需要计算方程,如果特征数量大的画,时间复杂度高
能够解决拟合问题不能解决拟合问题

梯度下降的优化方法:

算法的选择

  • 小规模 岭回归, LinearRegression(不能解决拟合问题)
  • 大规模 梯度下降

1.GD, 2.SGD, 3.SAG

1.GD:Gradient descent 梯度下降 需要把所有的样本值都计算出来,计算量大

2.SGD 随机梯度下降 SGD:高效且容易实现 缺点:需要很多的超参数

3.SAG 随机平均梯度下降法

sklearn中的API都实现了SAG优化。

过拟合和欠拟合

欠拟合: 原因:学习到的数据特征过少 解决方法:增加数据的学习特征数量

过拟合: 原因:模型过于复杂,原始的特征过多

解决方法:正则化,即尽量减小高次项的影响。

L1正则化 LASSO回归 公式

作用:使得一些W的数值直接为0,具有特征选择的能力。

L2正则化 Ridge(岭回归)

这个L2正则化后的损失函数,就是原本的损失函数(为了更好的求导,所以使用2m作为分母)+λ惩罚项

作用:去改变损失函数的方程,因为损失函数是越小越好,所以L2正则化系统就是说希望改变后面的正则化项。 也就是会优化w,使得其中一些W都很小,接近于0,来削弱某些特征的影响。

m 样本数, n 特征数 这个L2正则化后的损失函数,就是原本的损失函数(为了更好的求导,所以使用2m作为分母)+λ惩罚项

岭回归

岭回归就是带L2正则化的线性回归

正则化系数对于权重的影响。

由图可知,

  • 正则化力度越大,权重系数越小;
  • 正则化力度越小,权重系数越大。
def linear3():
    """
    岭回归对波士顿房价进行预测
    :return:
    """
    # 1)获取数据
    boston = load_boston()
    print("特征数量:\n", boston.data.shape)

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)

    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4)预估器
    estimator = Ridge(alpha=0.5, max_iter=10000)
    estimator.fit(x_train, y_train)

    # 保存模型
    # joblib.dump(estimator, "my_ridge.pkl")
    # 加载模型
    #estimator = joblib.load("my_ridge.pkl")

    # 5)得出模型
    print("岭回归-权重系数为:\n", estimator.coef_)
    print("岭回归-偏置为:\n", estimator.intercept_)

    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("岭回归-均方误差为:\n", error)

    return None

逻辑回归

虽然叫回归,但是它是用来处理分类的。

应用场景:(大部分是二分类)

  • 广告点击率
  • 是否为垃圾邮件
  • 是否患病
  • 金融诈骗
  • 虚假账号

线性回归算法的输出就是逻辑回归算法的输入。 它的损失函数和线性回归算法的损失函数不一样,它是对数似然损失。(吴恩达老师视频中的损失函数就是这个 )

癌症分类案例

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score
# 1、读取数据
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
#因为这个数据集数据没有名称,因此要为数据添加名称
column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
                   'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
                   'Normal Nucleoli', 'Mitoses', 'Class']

data = pd.read_csv(path, names=column_name)

# 2、数据处理
# 缺失值处理 数据集中有一些数据缺失,要将 ?替换掉
# 1)替换-》np.nan 将数据标记成无效值
data = data.replace(to_replace="?", value=np.nan)
# 2)删除缺失样本,因为他是去找nan数据,将具有nan数据类型的数据删除
data.dropna(inplace=True)
#data.isnull().any() # 不存在缺失值 如果输出都为False ,则说明输出不存在缺失值

# 3、划分数据集
# 筛选特征值和目标值
x = data.iloc[:, 1:-1]
y = data["Class"]
x_train, x_test, y_train, y_test = train_test_split(x, y)
#4.特征工程 标准化数据集
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 5、预估器流程
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
# 5)得出模型
print("权重系数为:\n", estimator.coef_)
print("偏置为:\n", estimator.intercept_)

# 6、模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)

# 方法2:计算准确率
#这个是测量模型的准确性,通过测试集来看训练集训练出来的模型
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

#因为我们更想知道判断癌症的准确率
# 查看精确率、召回率、F1-score
report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])
print(report)
# y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
# 将y_test 转换成 0 1,因为roc_auc_score这个指标只能传入0和1
y_true = np.where(y_test > 3, 1, 0)
roc_auc_score(y_true, y_predict)

分类评估方法

二分类的指标不是使用score那个函数。 混淆矩阵

两个指标: 1. 精确率 precisionn 2. 召回率 recall 3.F1-score 精确率:预测结果为正例样本中,真正为正例的比例

精确率 = TP / TP+TN

召回率: 真实为正例的样本中,预测结果为正例的比例

以癌症为例: 患癌症能够被检查出来的概率 —— 召回率

精确率和召回率都是越高越好

F1-score 反映模型稳健性

API:

report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])
print(report)

ROC曲线和AUC指标

样本不均衡时,需要使用这两个指标来看精确率和召回率的准确性。

TPR = TP/(TP+FN) - 召回率 FPR = FP/(FP+TN)

由FPR为横轴,TPR为纵轴构成的曲线,称为ROC曲线

ROC曲线和轴组成的面积称为AUC指标

蓝线为ROC曲线,红色面积称为AUC指标。 AUC=0.5,即中间红色虚线情况的时候,是最差的。 AUC=1,称为完美分类器,不过很少这种情况 0<AUC<0.5的时候,有点像正负相关,用1-AUC的数值,转到>0.5的情况。

API: roc_auc_score(y_true, y_predict) y_true:每个样本真实类别,必须为0(反例),1(正例) 所以上面癌症的案例中,我们最后面使用np.where 这个进行了一次判断。

y_true = np.where(y_test > 3, 1, 0)
roc_auc_score(y_true, y_predict)

AUC只能用于评价二分类算法中,用于评价样本不均衡中的分类器性能。

模型的保存和加载

from sklearn.externals import joblib

    # 保存模型
    # joblib.dump(estimator, "my_ridge.pkl")
    # 加载模型
    #estimator = joblib.load("my_ridge.pkl")

无监督学习 K-means算法

算法步骤:

  1. 随机设置K个特征空间内的点作为初始的聚类中心
  2. 对于其他每个计算与初始聚类中心点的距离
  3. 标记点与它距离近的为同一类别的点
  4. 计算这些点的平均值,作为中心点,看与原来的中心点是否一致,如果一致,那么结束循环。不一致,以计算的中心点为新的聚类中心进行计算进行分类。

API: from sklearn.cluster import KMeans estimator = KMeans(n_clusters=3)

如何对聚类结果进行评估 —— 轮廓系数

如果符合:“高内聚,低耦合”效果,则说明效果好 指内部距离最小化,外部距离最大化

bi本族群与外部族群点的距离,ai是内部族群点的平均值。 SCi 趋近1, 效果好, SCi趋近0,效果差。

API: silhouette_score(data_new, y_predict)

总结

线性回归算法中的损失函数 loss_function=(y_predict - y_true)^2/总数

逻辑回归因为它是二分类算法,因此它不能

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
三天快速入门Python机器学习(第三天)附源码笔记!
经典机器学习算法-第一章线性回归
机器学习系列:(二)线性回归
模型的评估
Py之skflow:skflow的简介、安装、使用方法、代码实现之详细攻略
sklearn库的学习
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服