python 怎么算l2范数_数学推导+纯Python实现机器学习算法13:Lasso回归

版权说明:本公号转载文章旨在学习交流,不用于任何商业用途,版权归原作者所有,如有异议,敬请后台联络我们,议定合作或删除,我们将第一时间按版权法规定妥善处理,非常感谢!


Python机器学习算法实现

Author:louwill

本节我们要介绍的是基于L1正则化的Lasso模型,下一节介绍基于L2正则化的Ridge模型。在正式介绍这两种模型之前,笔者还是想带大家复习一下过拟合和正则化等机器学习关键问题。

正则化与L1范数

     正则化是防止模型过拟合的核心技术之一,关于欠拟合和过拟合的问题,这里笔者就不再展开来说,不了解的朋友可以看看笔者很早之前写的一篇文章:谈谈过拟合。

     总的来说,监督机器学习的核心原理莫过于如下公式:

9b1da2fe6494998a5fe96b6822951871.png

      该公式可谓是机器学习中最核心最关键最能概述监督学习的核心思想的公式了:所有的有监督机器学习,无非就是正则化参数的同时最小化经验误差函数。最小化经验误差是为了极大程度的拟合训练数据,正则化参数是为了防止过分的拟合训练数据。你看,多么简约数学哲学。正如之前所说,监督机器学习是为了让我们建立的模型能够发现数据中普遍的一般的规律,这个普遍的一般的规律无论对于训练集还是未知的测试集,都具有较好的拟合性能。

      继续回到公式。第一项经验误差函数在机器学习中无疑地位重要,但它不是笔者今天要讲的,今天要讲的是公式的第二项:正则化项。第二项中 λ 为正则化系数,通常是大于 0 的,是一种调整经验误差项和正则化项之间关系的系数。λ = 0 时相当于该公式没有正则化项,模型全力讨好第一项,将经验误差进行最小化,往往这也是最容易发生过拟合的时候。随着 λ 逐渐增大,正则化项在模型选择中的话语权越来越高,对模型的复杂性的惩罚也越来越厉害。所以,在实际的训练过程中,λ 作为一种超参数很大程度上决定了模型生死。

     系数 λ 说完了,然后就是正则化项,正则化项形式有很多,但常见的也就是 L1 和 L2 正则化。本节我们先来看L1。

      在说常见的 L1 和 L2 之前,先来看一下 L0 正则化。L0 正则化也就是 L0 范数,即矩阵中所有非 0 元素的个数。如何我们在正则化过程中选择了 L0 范数,那该如何理解这个 L0 呢?其实非常简单,L0 范数就是希望要正则化的参数矩阵 W 大多数元素都为 0。如此简单粗暴,让参数矩阵 W 大多数元素为 0 就是实现稀疏而已。说到这里,权且打住,想必同样在机器学习领域摸爬滚打的你一定想问,据我所知稀疏性不通常都是用 L1 来实现的吗?这里个中缘由笔者不去细讲了,简单说结论:在机器学习领域,L0 和 L1 都可以实现矩阵的稀疏性,但在实践中,L1 要比 L0 具备更好的泛化求解特性而广受青睐。先说了 L1,但还没解释 L1 范数是什么,L1 范数就是矩阵中各元素绝对值之和,正如前述所言,L1 范数通常用于实现参数矩阵的稀疏性。至于为啥要稀疏,稀疏有什么用,通常是为了特征选择和易于解释方面的考虑。

Lasso

     Lasso的全称叫做Least absolute shrinkage and selection operator,直译过来为最小收缩与选择算子。其本质就是在常规的线性回归的基础上对参数加了一个L1正则化约束。其形式如下所示:

a9658806df97775c2725fc19b69c7307.png

     规约到线性回归模型上,上式的第一项就是MSE损失,第二项则是L1正则化项。我们同样按照之前线性回归的打法来对其进行实现,只是需要注意一下L1正则化项的求导处理。我们来看具体的实现代码。

导入相关package并读入示例数据:

import numpy as npimport pandas as pddata = np.genfromtxt('mystery.dat', delimiter = ',')# 选择特征与标签x = data[:,0:100] y = data[:,100].reshape(-1,1)# 加一列X = np.column_stack((np.ones((x.shape[0],1)),x))# 划分训练集与测试集X_train, y_train = X[:70], y[:70]X_test, y_test = X[70:], y[70:]print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)

b1d182a5ce6c334580f604ca6679d339.png

定义参数初始化函数:

# 定义参数初始化函数def initialize(dims):    w = np.zeros((dims, 1))    b = 0    return w, b

定义符号函数并进行向量化,用于对L1正则化项的梯度计算:

# 定义符号函数def sign(x):    if x > 0:        return 1    elif x < 0:        return -1    else:        return 0 # 利用numpy对符号函数进行向量化vec_sign = np.vectorize(sign)vec_sign(np.zeros((3,1))) 

3ae9f933713d2d018cf0b58f51ad6dba.png

在MSE损失函数的基础上定义Lasso损失:

# 定义lasso损失函数def l1_loss(X, y, w, b, alpha):    num_train = X.shape[0]    num_feature = X.shape[1]    y_hat = np.dot(X, w) + b    loss = np.sum((y_hat-y)**2)/num_train + np.sum(alpha*abs(w))    dw = np.dot(X.T, (y_hat-y)) /num_train + alpha * vec_sign(w)    db = np.sum((y_hat-y)) /num_train    return y_hat, loss, dw, db

定义Lasso训练过程函数:

# 定义训练过程def lasso_train(X, y, learning_rate=0.01, epochs=300):    loss_list = []    w, b = initialize(X.shape[1])    for i in range(1, epochs):        y_hat, loss, dw, db = l1_loss(X, y, w, b, 0.1)        w += -learning_rate * dw        b += -learning_rate * db        loss_list.append(loss)                if i % 50 == 0:            print('epoch %d loss %f' % (i, loss))        params = {            'w': w,            'b': b        }        grads = {            'dw': dw,            'db': db        }    return loss, loss_list, params, grads

执行训练:

# 执行训练示例loss, loss_list, params, grads = lasso_train(X_train, y_train, 0.01, 500)

04cc26737a6d3d62b7b085d44b7aa772.png

可以看到,在L1的约束下,在训练过程中有不少对标签贡献率低的特征的系数都变成了0。这就是L1的作用,一定程度上可以进行特征选择和实现稀疏化。

最后可以简单写一个Lasso回归的class来对上述过程进行封装:

import numpy as npfrom sklearn.metrics import r2_scoreclass Lasso():    def __init__(self):        pass        def prepare_data(self):        data = np.genfromtxt('./example.dat', delimiter = ',')        x = data[:, 0:100]        y = data[:, 100].reshape(-1, 1)        X = np.column_stack((np.ones((x.shape[0], 1)), x))        X_train, y_train = X[:70], y[:70]        X_test, y_test = X[70:], y[70:]        return X_train, y_train, X_test, y_test        def initialize_params(self, dims):        w = np.zeros((dims, 1))        b = 0        return w, b    def sign(self, x):        if x > 0:            return 1        elif x < 0:            return -1        else:            return 0            def l1_loss(self, X, y, w, b, alpha):        num_train = X.shape[0]        num_feature = X.shape[1]                y_hat = np.dot(X, w) + b        loss = np.sum((y_hat - y) ** 2) / num_train + np.sum(alpha*abs(w))        dw = np.dot(X.T, (y_hat - y)) / num_train + alpha*np.vectorize(self.sign)(w)        db = np.sum((y_hat - y)) / num_train        return y_hat, loss, dw, db        def lasso_train(self, X, y, learning_rate, epochs):        loss_list = []        w, b = self.initialize_params(X.shape[1])        for i in range(1, epochs):            y_hat, loss, dw, db = self.l1_loss(X, y, w, b, 0.1)            w += -learning_rate * dw            b += -learning_rate * db            loss_list.append(loss)                        if i % 300 == 0:                print('epoch %d loss %f' % (i, loss))                        params = {                'w': w,                'b': b            }            grads = {                'dw': dw,                'db': db            }        return loss, loss_list, params, grads            def predict(self, X, params):        w = params['w']        b = params['b']        y_pred = np.dot(X, w) + b        return y_pred    if __name__ == '__main__':    lasso = Lasso()    X_train, y_train, X_test, y_test = lasso.prepare_data()    loss, loss_list, params, grads = lasso.lasso_train(X_train, y_train, 0.01, 3000)    print(params)    y_pred = lasso.predict(X_test, params)    print(r2_score(y_test, y_pred))

以上是基于numpy的手动实现Lasso的过程,下面再来看Lasso在sklearn中的实现。

# 导入线性模型模块from sklearn import linear_model# 创建lasso模型实例sk_lasso = linear_model.Lasso(alpha=0.1)# 对训练集进行拟合sk_lasso.fit(X_train, y_train)# 打印模型相关系数print("sklearn Lasso intercept :", sk_lasso.intercept_)print("\nsklearn Lasso coefficients :\n", sk_lasso.coef_)print("\nsklearn Lasso number of iterations :", sk_lasso.n_iter_)

d81aa0a5b64683bab604308b2986ff5d.png

以上就是本节内容,下一节我们继续来看基于L2正则化的Ridge回归。

更多内容可参考笔者GitHub地址:

https://github.com/luwill/machine-learning-code-writing

参考资料:

https://www.analyticsvidhya.com/blog/2017/06/a-comprehensive-guide-for-linear-ridge-and-lasso-regression/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 8快多少?

Java SE 8已于昨天发布 。 传统上&#xff0c;每个新的主要JRE版本都提供免费的性能提升。 我们还能再得到免费的午餐吗&#xff1f; 这次收益有多大&#xff1f; 让我们对其进行基准测试。 基准方法 使用3个不同的JRE版本&#xff08;SunJDK 1.6.0_26 &#xff0c;OpenJDK 1…

Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误...

今天因为想要用OpenCV做图像识别&#xff0c;小白一个&#xff0c;在网上找到一个教程&#xff0c;但是需要配置OpenCV3.3.0的环境&#xff0c;于是又在网上找OpenCV3.3.0VS2013&#xff08;因为我之前已经安过了VS2013&#xff09;&#xff0c;前面的都顺利执行&#xff0c;但…

mvp的全称_是让人提神醒脑的 MVP、MVVM 关系精讲!

前言很高兴见到你&#xff01;我是《Jetpack MVVM 精讲》的独立原创作者 KunMinX&#xff0c;GitHub star 8.7k&#xff0c;专注于深度思考和 Jetpack MVVM 的分享。关于 MVP 和 MVVM 本质和区别的文章&#xff0c;本来我是不想写的&#xff0c;因为经过长达一年的耳濡目染 和对…

链家广州二手房的数据与分析——爬取数据

之前在博客分享了利用 R 和 rvest 包爬虫的基础方法。现在就来实战一下&#xff1a;爬取链家网广州 40,000 套二手房的数据。 之前在 Web Scraping with R 说过的爬虫方法在这篇中就不在赘述了。这里就分享怎么样爬取网站中翻页的数据。 >> Web Scraping across Multiple…

Vue脚手架搭建项目

全局安装vue脚手架 $ npm install -g vue-cli 卸载方法 $ npm uninstall -g vue-cli 查看vue版本&#xff08;注意&#xff1a;大写的V&#xff09; $ vue -V 创建项目 $ vue init webpack vue-app ? Project name vue-app ? Project description Vue Project ? Author Pr…

es安全组端口_从零开始在远程服务器(Linux)上搭建es,eshead和ik分词器

一、资源准备远程服务器一个&#xff08;本教程为CentOS 64位&#xff09;注&#xff1a;ik分词器版本需与es版本统一jdk1.8.0elasticsearch-head-master.zip二、开放端口注&#xff1a;本例采用的是阿里云服务器1.登录阿里云&#xff0c;选择控制台2.找到左上角的三条白线--》…

sipp模拟freeswitch分机测试(SIP协议调试)

1、freeswitch安装 1) 网上很多安装方法都不靠谱&#xff0c;系统版本&#xff0c;各种依赖库一堆问题&#xff0c;下面是验证的可行的。 yum install -y http://files.freeswitch.org/freeswitch-release-1-6.noarch.rpm epel-releaseyum install -y freeswitch-config-vanill…

hd计算机技术,BD和HD的区别是什么?

BD和HD的区别是什么?我们在网上下载电影的时候&#xff0c;往往发帖子的童鞋会提示我们影片的规格&#xff0c;如所谓BD1280或者HD1024等等&#xff0c;一些朋友搞不清楚这是什么意思&#xff0c;实际上我们只能说BD和HD的区别是什么&#xff0c;关于1280和1024那完全是分辨率…

消息提示框-事件冒泡

1 <!DOCTYPE html>2 <html lang"en">3 4 <head>5 <meta charset"UTF-8">6 <title>事件冒泡-提示框</title>7 </head>8 <style>9 button {10 width: 160px;11 height: 30px;12 backgr…

我是如何解决asp.net程序在dreamWeaver中布局乱码的问题

每次把asp.net程序导入Dw2004中时&#xff0c;总是出现乱码&#xff0c;也不知道是什么原因。今天我就换了一个版本&#xff08;DW8&#xff09;&#xff0c;发现以前的问题全都没了。我想肯定是我的DW出现了问题&#xff0c;因为以前也出现过一次&#xff0c;也是重装后解决掉…

分段函数if语句_C语言函数系列之库函数中基础必会函数(一)

&#xff01;&#xff01;&#xff01;阅前提醒&#xff1a;&#xff01;&#xff01;&#xff01;此文为c语言函数系列的第一篇&#xff0c;全系列字数将达到1w字以上且全为干货内容&#xff0c;请各位仔细阅读并打开编译器运行文章中出现的代码进行试验以确保能理解文章内容i…

JavaFX中的塔防(6)

因此&#xff0c;我们已经在本教程的第6部分中&#xff0c;与此同时&#xff0c;游戏也取得了长足的进步。 在这一部分中&#xff0c;我们最终将添加一个显示得分的图层&#xff0c;已达到目标的敌人数量&#xff0c;启动下一个Wave的按钮以及用于购买新炮塔的资金。 说到钱&am…

教师计算机网络培训工作总结,教师培训工作的自我总结

【导读】教师培训工作的自我总结为好范文网的会员投稿推荐&#xff0c;但愿对你的学习工作带来帮助。教师是一个平凡而又伟大的职业&#xff0c;那教师培训工作总结怎么写呢?下面小编就和大家分享教师培训工作总结&#xff0c;来欣赏一下吧。教师培训工作总结(一)一年来&#…

十一 hashlib模块

# 1、什么叫hash:hash是一种算法&#xff08;3.x里代替了md5模块和sha模块&#xff0c;主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 &#xff0c;MD5 算法&#xff09;&#xff0c;该算法接受传入的内容&#xff0c;经过运算得到一串hash值 # 2、hash值的特点是&#xff1a…

HashMap如何在Java中工作

面试中最常见的问题是“ HashMap如何在Java中工作”&#xff0c;“ HashMap的获取和放置方法如何在内部工作”。 在这里&#xff0c;我试图通过一个简单的示例来解释内部功能。 而不是理论&#xff0c;我们将首先从示例开始&#xff0c;以便您更好地理解&#xff0c;然后我们将…

input上传文件个数控制

HTML: 1 <h3>请上传[2,5]个文件</h3>2 <form action"" enctype"multipart/form-data">3 <input type"file" name"file" multiple"multiple" id"file" onchange"fileCo…

东北农业大计算机排名,黑龙江高校排名更新,东北林大排名第3,东油排名第8...

东北地区的经济发展起步比较早&#xff0c;属于我国的老牌重工业基地&#xff0c;被称为“新中国工业的摇篮”&#xff0c;是我国最重要的经济支柱。这里的高校也因此而受到重视&#xff0c;为日后的发展奠定了扎实的基础&#xff1b;随着国家经济重心的转移&#xff0c;因为地…

150个Java面试问答-最终清单(PDF下载)

我们的Java面试问题和答案集合全都涉及可以在Java面试中使用的不同类型的问题&#xff0c;以使雇主可以测试您在Java和面向对象编程方面的技能。 在以下各节中&#xff0c;我们将讨论有关面向对象编程及其特性的Java面试问题&#xff0c;有关Java及其功能的一般问题&#xff0…

计算机电子电路原理图,简单电路图入门-电路原理图入门知识图解

简单电路图入门-电路原理图入门知识图解电路图的分类简单电路图入门&#xff0c;常遇到的电子电路图有原理图、方框图、装配图和印版图等。1、原理图原理图就是用来体现电子电路的工作原理的一种电路图&#xff0c;又被叫做“电原理图”。这种图由于它直接体现了电子电路的结构…

老是不中,算了算“双色球”和“3D”,全买到底要多少¥¥。。(C 代码)

最近也做发财梦&#xff0c;买了段时间得彩票&#xff0c;不得要领&#xff0c;今天写了两个小程序&#xff0c;算算把所有号码组合都买下到底要多少&#xffe5;&#xffe5;。。还是先贴个规则吧&#xff1b;双色球&#xff1a;从 1~33 中选6个不重复得数值&#xff08;红球&…