sklearn 模型在线学习、增量更新实现 (以SGD方式训练LR为例)

article/2025/9/2 12:32:35

sklearn online learning

在 sklearn官方文档里以 online 为关键字进行检索

在这里插入图片描述
在线学习是可以通过小批量的数据迭代更新模型的权重,增量训练方法看 partial_fit,于是检索了一下 partial_fit,介绍如下:

在这里插入图片描述

不同与使用fit方法,partial_fit 方法不需要清空模型(不用清空模型原来就学习好的权重),只需要每次用小批量的数据进行 partial_fit,每个 batch 的数据的 shape 应保持一致。在可迭代训练的模型中(可以进行增量学习的模型),partial_fit 通常只执行一次迭代

通常,在使用 partial_fit 时,模型的参数不应该改变(每次使用 partial_fit 的模型参数保持一致)

partial_fit 使用的时候要返回对象

模型

这里使用逻辑回归模型,用 SGD 的方式进行模型训练,这里主要是为了说明 online learning 如何实现,所以尽量简化特征工程

数据集

https://www.kesci.com/home/dataset/5dd78542f41512002ceb25f3/document

实践

以用户行为数据为例,在原始数据集中取出 1/10作为增量学习的数据,测试进行增量学习之后的,模型特征对应的权重的改变,and 模型预测精度的改变。

具体步骤

  • 进行简单的 预处理&特征工程
  • 划分增量学习的数据(1/10) 和 另一部分数据(9/10)
  • 讲另一部分数据(9/10)划分训练集和测试集,使用训练集训练 LR 模型(fit
  • 使用 partial_fit 进行模型增量学习,并查看模型的特征权重、精度是否改变
import numpy as np
import pandas as pd
import warningswarnings.filterwarnings('ignore')
book_ratings = pd.read_csv('BX-Book-Ratings1.csv', sep=';', encoding='utf-8')
# books = pd.read_csv('BX-Books1.csv', sep=';')
users = pd.read_csv('BX-Users1.csv', sep=';')
book_ratings.sample(10)
User-IDISBNBook-Rating
53570312911007868860210.0
59201614271506794476520.0
74576918049503754136340.0
114610727592201420017409.0
87170521095904454051985.0
83638920211306848382308.0
1743583790501401586188.0
110144226432108125586267.0
58658514165134780868330.0
1106262638898200500.0
users.sample(10)
User-IDLocationAge
258196258197seattle, washington, usa41.0
3601936020wuxi, jiangsu, china24.0
1559115592newark, delaware, usa23.0
267320267321scottsbluff, nebraska, usa28.0
109842109843braga, braga, portugal22.0
121294121295madrid, n/a, spain56.0
1607716078waldorf, maryland, usa37.0
7528375284vidalia, georgia, usaNaN
195592195593melbourne, victoria, australia26.0
177463177464hanover, michigan, usa52.0
# 空值情况
book_ratings.isnull().sum(), users.isnull().sum()
(User-ID        0ISBN           0Book-Rating    8dtype: int64, User-ID          0Location         0Age         110765dtype: int64)
users.shape
(278858, 3)
# 填充用户评分的空值为0
book_ratings.fillna(0.0, inplace=True)
# 用户的年龄用均值填充,由于缺失数量大,但是特征重要
users['Age'].fillna(users['Age'].mean(), inplace=True)
# 只要国家,不要详情的地区了
users['Location'] = users['Location'].str.split(',').apply(lambda str_list:str_list[-1])
users.Location.value_counts()
 usa               139711canada             21657united kingdom     18538germany            17041spain              13126...  toscana                1wood                   1bosnia                 1pasco                  1galiza neghra          1
Name: Location, Length: 755, dtype: int64
# 国家也不要了
users.drop('Location', axis=1, inplace=True)
dataset = pd.merge(book_ratings, users, on='User-ID')
dataset[dataset['Book-Rating'] > 0].shape
(433664, 4)
# 处理标签
dataset['Book-Rating'].apply(lambda x:1 if x>0 else 0).value_counts()
0    716116
1    433664
Name: Book-Rating, dtype: int64
dataset['Book-Rating'] = dataset['Book-Rating'].apply(lambda x:1 if x>0 else 0)
dataset.head()
User-IDISBNBook-RatingAge
0276725034545104X034.751661
12767260155061224134.751661
22767270446520802016.000000
3276729052165615X116.000000
42767290521795028116.000000
dataset.shape[0] /10
114978.0
user_item, data = dataset[['User-ID', 'ISBN']], dataset[['Book-Rating', 'Age']]
# 取出 1/10 作为后面要增量训练的数据
online_learning_train, train = data[:114978], data[114978:]
from sklearn.model_selection import train_test_splitX, y = train.drop(columns=['Book-Rating']), train['Book-Rating']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
from sklearn.linear_model import SGDClassifier
%%time
lr_sgd = SGDClassifier(loss='log', warm_start=True).fit(X_train, y_train)
Wall time: 5.49 s
X_train.shape, y_train.shape
((827841, 1), (827841,))
lr_sgd.score(X_test, y_test)
0.6276883084252589
lr_sgd.coef_
array([[-0.01391971]])
def get_batch(online_learning_train):for row in online_learning_train.iterrows():# 生成器,每次返回一个要训练的样本yield row[1]['Book-Rating'], row[1]['Age']batch_generator = get_batch(online_learning_train)
# for i in range(10):
#     print(next(batch_generator))
# 增量更新模型label, feature = next(batch_generator)
lr_sgd.partial_fit([[feature]], [label])
SGDClassifier(alpha=0.0001, average=False, class_weight=None,early_stopping=False, epsilon=0.1, eta0=0.0, fit_intercept=True,l1_ratio=0.15, learning_rate='optimal', loss='log', max_iter=1000,n_iter_no_change=5, n_jobs=None, penalty='l2', power_t=0.5,random_state=None, shuffle=True, tol=0.001,validation_fraction=0.1, verbose=0, warm_start=True)
lr_sgd.coef_
array([[-0.01697226]])
for i in range(20):label, feature = next(batch_generator)lr_sgd = lr_sgd.partial_fit([[feature]], [label])# 注意要返回这个对象print(lr_sgd.score(X_test, y_test))print(lr_sgd.coef_)
 0.6276883084252589
[[-0.00304325]]
0.6276883084252589
[[-0.00588775]]
0.6276883084252589
[[-0.00175116]]
0.6135455472287049
[[0.00449768]]
0.6276883084252589
[[-0.00060454]]
0.6276883084252589
[[-0.00468685]]
0.6276883084252589
[[0.00109888]]
0.6250839530153024
[[0.00402928]]
0.4302066572929199
[[0.00872931]]
0.3764235773889767
[[0.01224813]]
0.4302066572929199
[[0.00875256]]
0.5881011398282768
[[0.00540715]]
0.42067346021714236
[[0.00906837]]
0.5847188600750866
[[0.00570941]]
0.6267026154686148
[[0.00249447]]
0.6276883084252589
[[-0.00058331]]
0.6276883084252589
[[-0.00353084]]
0.6276883084252589
[[-0.00635496]]
0.6276883084252589
[[-0.00906232]]
0.6276883084252589
[[-0.01165938]]

http://chatgpt.dhexx.cn/article/RYym6LdT.shtml

相关文章

机器学习——LR(线性回归)、LRC(线性回归分类)与人脸识别

忆如完整项目/代码详见github:https://github.com/yiru1225(转载标明出处 勿白嫖 star for projects thanks) 目录 系列文章目录 一、LR的概念、原理与LR用于简单数据的预测 1.LR简介 2.LR算法模型 3.LR用于简单数据的预测 二、LRC的简…

Toad:基于 Python 的标准化评分卡模型

大家好,我是东哥。 在信贷的风控模型中最常用、最经典的可能要属评分卡了,所谓评分卡就是给信贷客户进行打分,按照不同业务场景可为贷前、贷中、贷后和反欺诈,一般叫做ABCF卡。模型得到分数,通过设置cutoff阈值给出评…

LGB+LR的实践

文章目录 1 背景2 原理3 数据的准备3.1 读入数据3.2 切分训练集测试集 4 LR5 LGB6 LGBLR6.1 LGB实现6.2 LGB的vector导出来!6.2.1 训练集6.2.2 测试集 6.3 LRLGB 7 结果对比 1 背景 相信大名鼎鼎的GBDTLR组合很多小伙伴都听过,这种组合模型的预测效果要…

[机器学习] LR与SVM的异同

1 为什么将LR和SVM放在一起来进行比较? 回答这个问题其实就是回答LR和SVM有什么相同点。 第一,LR和SVM都是分类算法。 看到这里很多人就不会认同了,因为在很大一部分人眼里,LR是回归算法。我是非常不赞同这一点的,因…

pytorch:多标签分类的损失函数和准确率计算

1 损失函数 我们先用sklearn生成一个多标签分类数据集。 from sklearn.datasets import make_multilabel_classificationX, y make_multilabel_classification(n_samples1000,n_features10,n_classes3,n_labels2,random_state1) print(X.shape, y.shape)看一下标签长啥样。 …

caffe训练分类模型教程

caffe训练分类模型教程 1.已有图像存放在train和val下,book和not-book(两类)的图片数量相同 在caffe/data下新建一個myself文件夾,并新建两个文件夹分别命名为train和val 批量重命名图片 # -*- coding:utf8 -*- import os class …

金融风控实战——模型融合

过采样方法使用条件 (1)负样本可以代表样本空间 (2)数据是足够干净的(样本、特征没有噪声) 过拟合 (1)增多数据 (2)特征筛选 (3)调参…

【推荐算法】ctr预估模型总结(LR、FM、FFM、NFM、AFM、WDL、DCN、DeepFM、FwFM、FLEN)

文章目录 前言LRPOLY2FM(Factorization Machine)FFM(Field-aware Factorization Machine)AFM(Attention Factorization Machine)NFM(Neural Factorization Machine)WDL(w…

概率图模型 —— 串连 NB、LR、MEM、HMM、CRF

概率图模型(PGM),作为机器学习的重要分支,能串连起很多传统模型,比如 NB、LR、MEM、HMM、CRF、DBN 等。本篇文章,从串连多个模型的角度,来谈谈 PGM,顺便把这些模型回顾下。 1 Why PG…

基于GBDT+LR模型的深度学习推荐算法

GBDTLR算法最早是由Facebook在2014年提出的一个推荐算法,该算法分两部分构成,第一部分是GBDT,另一部分是LR.下面先介绍GBDT算法,然后介绍如何将GBDT和LR算法融合 1.1 GBDT算法 GBDT的全称是 Gradient Boosting Decision Tree&am…

Logistic逻辑回归模型(LR)基础

逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,但也就由于这个逻辑函数,使得逻辑回归模型成为了机器学习领域一颗耀眼的明星,更是计算广告学的核心。本文主要详述逻辑回归模型的基础&#x…

模型压缩一-知识蒸馏

一、知识蒸馏简介 知识蒸馏是模型压缩方法中的一个大类,是一种基于“教师-学生网络(teacher-student-network)思想”的训练方法, 其主要思想是拟合教师模型(teacher-model)的泛化性等(如输出概率…

推荐系统之GBDT+LR

前言 前面讲过的FM与FFM模型虽然增强了模型的交叉能力,但是不管怎样都只能做二阶的交叉,如果想要继续加大特征交叉的维度,那就会出大计算爆炸的情况。所以Facebook提出了梯度提升树(GBDT)逻辑回归(LR&…

使用Keras进行单模型多标签分类

原文:https://www.pyimagesearch.com/2018/05/07/multi-label-classification-with-keras/ 作者:Adrian Rosebrock 时间:2018年5月7日 源码:https://pan.baidu.com/s/1x7waggprAHQDjalkA-ctvg (wa61) 译者&…

LR模型常见问题小议

 LR模型常见问题小议 标签: LR机器学习 2016-01-10 23:33 671人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 机器学习(10) 作者同类文章 X 版权声明:本文为博主原创文章&…

信用评分卡(A卡) 基于LR模型的数据处理及建模过程

数据来自:魔镜杯风控算法大赛(拍拍贷)。有关数据的具体描述可以看比赛页面。 0. 数据集的关键字段及描述: Master:每一行代表一个样本(一笔成功成交借款),每个样本包含200多个各类…

机器分类---LR分类+模型评估

文章目录 数据集ROC曲线与AUC理论知识曲线理解实例计算 代码 更详细的数据集介绍(有图形分析,应该比较好理解) https://blog.csdn.net/weixin_42567027/article/details/107416002 数据集 数据集有三个类别,每个类别有50个样本。…

python机器学习算法(赵志勇)学习笔记( Logistic Regression,LR模型)

Logistic Regression(逻辑回归) 分类算法是典型的监督学习,分类算法通过对训练样本的学习,得到从样本特征到样本的标签之间的映射关系,也被称为假设函数,之后可利用该假设函数对新数据进行分类。 通过训练数据中的正负样本,学习样本特征到样本标签之间的假设函数,Log…

推荐系统实战中LR模型训练(二)

背景: 上一篇推荐系统实战中LR模型训练(一) 中完成了LR模型训练的代码部分。本文中将详细讲解数据准备部分,即将文本数据数值化为稀疏矩阵的形式。 文本数据: 稀疏矩阵: 实现过程: 文本数据格…

机器学习 | LR逻辑回归模型

逻辑回归(Logistic Regression,简称LR)名为“回归”却是用来分类工作、在线性数据上表现优异的分类器。 视频教程:第07讲:逻辑回归是线性分类器的佼佼者 LR是数据挖掘领域常用的一种分类模型,常用于解决二分类问题,例如垃圾邮件判定、经济预测、疾病诊断(通过年龄、性…