特征工程及python实现

news2025/1/15 16:40:02

一、特征构建

概述

从原始数据中构建新的特征,一般需要根据业务分析,生成能更好体现业务特性的新特征,这些新特征要与目标关系紧密,能提升模型表现或更好地解释模型。

方法

时间周期:不同的时间切片长度,例如近1个月,近3个月,最近一次,最远一次等;按照上午、下午、晚上等进行构建
特征聚合(求和,均值,方差,最大值,最小值,计数),如地址、手机号数等
修饰词(维度):维度是描述事情的角度 ,依赖于指标,如性别,地区,所属机构等
特征组合
业务角度:地址,正常建模无法直接使用,可进行标准化后,根据用户是否存在频繁更换地址等进行分析;手机号个数等
技术角度:任意特征交叉、log变换、连续值离散化,one-hot编码、woe编码

二、特征提取

概述

将一些原始的输入的数据维度减少或者将原始的特征进行重新组合以便于后续的使用

方法

主成分分析

主成分分析是特征提取中的常用方法,用于数据降维,目的是通过线性变换将原始数据变换为一组各维度线性无关的表示,核心思想n维特征映射到k维空间上k<n,这k维特征是全新的正交特征。
可消除数据的多重共线性。
在这里插入图片描述

from sklearn.decomposition import PCA
import numpy as np
pca = PCA()
pca.fit(data)
eigenvalues = pca.explained_variance_
eigenvectors = pca.components_
print("特征值:")
print(eigenvalues)
print("特征向量:")
print(eigenvectors)
'''
特征值:
[32.499999999999986, 0.0, 0.0]
特征向量:
[[ 0.57735027  0.57735027  0.57735027]
 [ 0.68092061 -0.68092061  0.28205707]
 [-0.4472136   0.4472136  -0.77459667]]

'''

独立成分分析(ICA)

ICA独立成分分析是从多元(多维)统计数据中寻找潜在因子或成分的一种方法.ICA与其它的方法重要的区别在于,它寻找满足统计独立和非高斯的成分。

线性判别分析(LDA)

LDA是将通过投影的方法,投影到维度更低的空间,使得投影后的点,会形成按类别区分,相同类别的点,将会在投影后更接近,不同类别的点距离越远。
LDA的思想是设法将样本投影到一条直线上,使得:

同类样本的投影点尽可能近
异类样本的投影点尽可能远

LDA也称为Fisher判别分析,是从更利于分类的角度来降维,利用到了训练样本的类别标记,追求的是最能够分开各个类别数据的投影方法。

三、特征筛选

概述

从特征集合中筛选出一组最具统计意义的特征子集,原则:获取尽可能小的特征子集,不显著降低分类精度、不影响分类分布以及特征子集应具有稳定、适应性强等特点。

目的

  • 减少特征数量、降维
  • 降低学习任务的难度,提升模型的效率
  • 使模型泛华能力更强,减少过拟合
  • 增强对特征和特征值之间的理解

方法

过滤式(Filter)

Correlation coefficient scores(相关系数)
import pandas as pd
import numpy as np

# 假设 df 是包含特征和目标变量的数据框
correlation_matrix = df.corr()
target_column = 'target'  # 目标变量的列名
important_features = correlation_matrix[target_column].abs().sort_values(ascending=False)
Information gain(信息增益)

信息增益,基于信息熵来计算,它表示信息消除不确定性的程度,可以通过信息增益的大小为变量排序进行特征选择。信息量与概率呈单调递减关系,概率越小,信息量越大。
基于信息增益的特征选择有两种方式,即信息增益和信息增益率。

1) 信息增益,即先验熵到后验熵减少的部分,反映了信息消除不确定性的程度,定义如下:
在这里插入图片描述
**特征选择原理:**在进行特征选择时,以目标变量作为信息U,由特征变量作为信息V,带入公式计算信息增益,通过信息增益的大小排序,来确定特征的顺序,以此进行特征选择。信息增益越大,表示变量消除不确定性的能力越强。
**缺点:**当接收信号V为全不相同的类别时,将会使Ent(U|V)=0,信息增益将最大。由于每一个V值都是一个类别,对应的U值也只有一个值,取该值的概率为1,这明显是一种过拟合,因此基于信息增益来进行特征选择存在不足。
2)信息增益率
为解决信息增益的不足,在计算信息增益的同时,考虑接收信号V的自身特点,定义信息增益率如下:
在这里插入图片描述
当接收信号V具有较多类别值时,它自己的信息熵范围会增大 (即各类别出现的概率相等时,有最大熵Ent(U)=log2k​​​​​​​,因此当k较大时,其熵的取值范围更大),而信息增益率不会随着增大,从而消除类别数目带来的影响。

互信息

互信息法是一种基于信息论的特征筛选方法。它通过计算特征与目标变量之间的互信息值来评估特征的重要性。互信息值越大,说明特征与目标变量之间的关联性越强。在Python中,可以使用minepy库来计算互信息值。

Gini-index尼基系数
Chi-squared test(卡方检验)

经典的卡方检验是检验类别型变量对类别型变量的相关性。
在这里插入图片描述
Sklearn的实现是通过矩阵相乘快速得出所有特征的观测值和期望值,在计算出各特征的 χ2 值后排序进行选择。在扩大了 chi2 的在连续型变量适用范围的同时,也方便了特征选择。

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
x, y = load_iris(return_X_y=True)

x_new = SelectKBest(chi2, k=2).fit_transform(x, y)
缺失率

剔除缺失值较多的特征

# 特征缺失率
miss_rate_df = df.isnull().sum().sort_values(ascending=False) / df.shape[0]
iv(Information Value,信息量)

IV表征特征的预测能力:小于0.02,几乎没有预测能力;小于0.1,弱;小于0.3,中等;小于0.5,强;大于0.5,难以置信,需进一步确认
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#先封装计算IV的方法
def CalcIV(Xvar,Yvar):
    N_0=np.sum(Yvar==0)
    N_1=np.sum(Yvar==1)
    N_0_group=np.zeros(np.unique(Xvar).shape)
    
    N_1_group=np.zeros(np.unique(Xvar).shape)
    for i in range(len(np.unique(Xvar))):
        N_0_group[i] = Yvar[(Xvar==np.unique(Xvar)[i])&(Yvar==0)].count()
        N_1_group[i] = Yvar[(Xvar==np.unique(Xvar)[i])&(Yvar==1)].count()
    iv = np.sum((N_0_group/N_0-N_1_group/N_1)*np.log((N_0_group/N_0)/(N_1_group/N_1)))
    if iv>=1.0:## 处理极端值
        iv=1
    return iv

def caliv_batch(df,Yvar):
    ivlist=[]
    for col in df.columns:
        iv=CalcIV(df[col],Yvar)
        ivlist.append(iv)
    names=list(df.columns)
    iv_df=pd.DataFrame({'Var':names,'Iv':ivlist},columns=['Var','Iv'])

    return iv_df,ivlist
im_iv, ivl = caliv_batch(datafinal,data_train)

#再进行数据处理:
threshold = 0.02
threshold2 = 0.6
data_index=[]
for i in range(len(ivl)):
    if (im_iv['Iv'][i]< threshold)|(im_iv['Iv'][i] > threshold2):
        data_index.append(im_iv['Var'][i])
datafinal.drop(data_index,axis=1,inplace=True)

psi(Population Stability Index,群体稳定性指标)

一般在风控中会拿0.25来作为筛选阈值,即PSI>0.25我们就认定这个变量或者模型不稳定了。
在这里插入图片描述
其中,Ai代表第i组的实际占比(占全部数量),Ei代表第i组的期望占比(也就是训练时或者上线时的分组占比)
计算步骤:

step1:将变量预期分布(excepted)进行分箱(binning)离散化,统计各个分箱里的样本占比。
注意:
  a) 分箱可以是等频、等距或其他方式,分箱方式不同,将导致计算结果略微有差异;
  b) 对于连续型变量(特征变量、模型分数等),分箱数需要设置合理,一般设为10或20;对于离散型变量,如果分箱太多可以提前考虑合并小分箱;分箱数太多,可能会导致每个分箱内的样本量太少而失去统计意义;分箱数太少,又会导致计算结果精度降低。
step2: 按相同分箱区间,对实际分布(actual)统计各分箱内的样本占比。
step3:计 算各分箱内的A - E和Ln(A / E),计算index = (实际占比 - 预期占比)* ln(实际占比 / 预期占比) 。
step4: 将各分箱的index进行求和,即得到最终的PSI。
在这里插入图片描述

筛选变量
1)选择训练数据,并且确定变量的最优分箱
2)初始化变量的期望占比分布
3)计算变量每个月的变量PSI
4)观察是否有PSI超过0.25的变量,剔除。

df = pd.read_csv('../0-数据/var_sample.csv')

def calculate_psi(base_list, test_list, bins=10, min_sample=10):
    # @东哥的风控小密圈
    try:
        base_df = pd.DataFrame(base_list, columns=['score'])
        test_df = pd.DataFrame(test_list, columns=['score']) 
        
        # 1.去除缺失值后,统计两个分布的样本量
        base_notnull_cnt = len(list(base_df['score'].dropna()))
        test_notnull_cnt = len(list(test_df['score'].dropna()))

        # 空分箱
        base_null_cnt = len(base_df) - base_notnull_cnt
        test_null_cnt = len(test_df) - test_notnull_cnt
        
        # 2.最小分箱数
        q_list = []
        if type(bins) == int:
            bin_num = min(bins, int(base_notnull_cnt / min_sample))
            q_list = [x / bin_num for x in range(1, bin_num)]
            break_list = []
            for q in q_list:
                bk = base_df['score'].quantile(q)
                break_list.append(bk)
            break_list = sorted(list(set(break_list))) # 去重复后排序
            score_bin_list = [-np.inf] + break_list + [np.inf]
        else:
            score_bin_list = bins
        
        ...
        
        # 5.汇总统计结果    
        stat_df = pd.DataFrame({"bucket": bucket_list, "base_cnt": base_cnt_list, "test_cnt": test_cnt_list})
        stat_df['base_dist'] = stat_df['base_cnt'] / len(base_df)
        stat_df['test_dist'] = stat_df['test_cnt'] / len(test_df)
        
        def sub_psi(row):
            # 6.计算PSI
            base_list = row['base_dist']
            test_dist = row['test_dist']
            # 处理某分箱内样本量为0的情况
            if base_list == 0 and test_dist == 0:
                return 0
            elif base_list == 0 and test_dist > 0:
                base_list = 1 / base_notnull_cnt   
            elif base_list > 0 and test_dist == 0:
                test_dist = 1 / test_notnull_cnt
                
            return (test_dist - base_list) * np.log(test_dist / base_list)
        
        stat_df['psi'] = stat_df.apply(lambda row: sub_psi(row), axis=1)
        stat_df = stat_df[['bucket', 'base_cnt', 'base_dist', 'test_cnt', 'test_dist', 'psi']]
        psi = stat_df['psi'].sum()
        
    except:
        print('error!!!')
        psi = np.nan 
        stat_df = None
    return psi, stat_df
#现在我们想对LoanAmount借款金额这个单变量,以5月为预期分布6月为实际分布进行稳定性计算。
var = 'LoanAmount'
base = df.loc[df['date']=='2023-05',var]
test = df.loc[df['date']=='2023-06',var]
calculate_psi(base_list=list(base),test_list=list(test))

在这里插入图片描述

优缺点

优点:计算高效,对于过拟合问题具有较高的鲁棒性;
缺点:倾向于选择冗余特征,因为不考虑特征间的相关性,有可能某一特征分类能力较差,但是和其他特征组合后具有较强的分类效果;

包裹式(Wrapper)

主要思想:这种方法将特征选择过程与模型训练过程相结合,通过评估不同特征子集对模型性能的影响来选择特征。常见的包裹式特征筛选方法包括递归特征消除(通过递归地考虑越来越小的特征集来选择特征)和基于模型的特征重要性评估(如使用随机森林或梯度提升机等模型来评估特征的重要性)。包裹式特征筛选的优点是能够考虑特征之间的交互作用,选择出对模型性能贡献最大的特征;缺点是计算成本较高,尤其是在特征数量较多时。

错误分类率(Classifier error)

使用特定的分类器,用给定的特征子集对样本集进行分类,用分类的精度来衡量特征子集的好坏;

前向搜索(forword search)

初始时假定选定的特征集合为空,采用贪心的方式逐步扩充该集合,直到集合的特征数量达到阈值,阈值可提前设定,也可通过交叉验证获得。

后向搜索(backward search)

初始时假定特征集合为所有的特征,算法每次删除一个特征,指导特征集合中的特征数达到阈值

from sklearn.datasets import make_regression
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression

# 构造回归问题的数据集
X, y = make_regression(n_samples=1000, n_features=20, noise=0.1)

# 初始化线性回归模型作为评估器
estimator = LinearRegression()

# 使用递归特征消除选择特征
selector = RFE(estimator, n_features_to_select=10, step=1)
X_new = selector.fit_transform(X, y)

嵌入式(Embeded)

这种方法在模型训练过程中自动进行特征选择。一些机器学习算法(如决策树、随机森林和深度学习模型等)具有内置的特征重要性评估机制,可以在训练过程中自动评估每个特征的重要性。嵌入式特征筛选的优点是计算效率高且能够考虑特征之间的交互作用;缺点是需要依赖于特定的机器学习算法,并且不同算法可能给出不同的特征重要性评估结果。

L1正则化

L1正则方法具有稀疏解的特性,直观从二维解空间来看L1-ball 为正方形,在顶点处时(如W2=C, W1=0的稀疏解),更容易达到最优解。可见基于L1正则方法的会趋向于产生少量的特征,而其他的特征都为0。

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression

x_new = SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(x,  y)
随机森林

随机森林具有准确率高、鲁棒性好、易于使用等优点,这使得它成为了目前最流行的机器学习算法之一。随机森林提供了两种特征选择的方法:mean decrease impurity和mean decrease accuracy。

1)平均不纯度减少(Mean decrease impurity)

(1)随机森林由多个决策树构成。决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。
(2)利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。
(3)当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。
(4)程序实现:直接使用sklearn训练RF模型,然后通过feature_importances_属性可以得到每个特征的特征重要性,该特征重要性是根据不纯度减少计算而来。

2)平均精确度减少(Mean decrease accuracy)
(1)另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响。
(2)主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。

from sklearn.ensemble import RandomForestRegressor
import pandas as pd

# 初始化随机森林模型
rf = RandomForestRegressor(n_estimators=100, random_state=0)
rf.fit(X, y)

# 获取特征重要性
importances = rf.feature_importances_
feature_importances_df = pd.DataFrame({'feature': X.columns, 'importance': importances})
feature_importances_df = feature_importances_df.sort_values(by='importance', ascending=False)

决策树

其他

1)稳定性选择(Stability selection)

(1)稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。
(2)它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果。
比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。
(3)理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。

2)递归特征消除(Recursive feature elimination,RFE)

(1)递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征放到一遍,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。
(2)这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。
(3)RFE的稳定性很大程度上取决于在迭代的时候底层用哪种模型。
例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;
假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。

from sklearn.feature_selection import RFE
rfe = RFE(estimator,n_features_to_select,step)
rfe = rfe.fit(x, y)
print(rfe.support_)
print(rfe.ranking_)

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

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

相关文章

Linux信号大揭秘-从中断到控制进程,一步步掌握进程通信利器!

在Linux环境下&#xff0c;信号(Signal)是一种软件中断&#xff0c;用于通知进程发生了某些重要事件。无论你是在编写命令行工具、服务程序&#xff0c;还是开发图形界面应用&#xff0c;都离不开对信号的处理。本文将全面解析信号的工作原理&#xff0c;并通过实例代码让你彻底…

实用软件分享---简单菜谱 0.3版本 几千种美食(安卓)

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

重生之 SpringBoot3 入门保姆级学习(14、内容协商基础简介)

重生之 SpringBoot3 入门保姆级学习&#xff08;14、内容协商基础简介&#xff09; 3.3 内容协商3.3.1 基础简介3.3.2 演示效果 3.3 内容协商 3.3.1 基础简介 默认规则 基于请求头的内容协商&#xff08;默认开启&#xff09; 客户端向服务器发送请求&#xff0c;携带 HTTP 标…

大归纳!!教你使用<string.h>的字符函数与字符串函数!!☑

这篇博客为你归纳了所有的字符函数和最常用的字符串函数&#xff0c;以及对应的模拟实现&#xff01;&#xff01;你可以直接循着目录跳到你需要的段落哦&#xff01;&#xff01;&#x1f60d; 目录 字符函数 字符分类 字符判断函数 islower——判断小写字母 isupper——…

上位机图像处理和嵌入式模块部署(f407 mcu中的udp server开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 既然lwip已经port到407上面了&#xff0c;接下来其实就可以做一些测试了。本身lwip支持tcp、udp&#xff0c;也支持client和server&#xff0c;既然…

Qt信号槽与函数直接调用性能对比

1. 测试方法 定义一个类Recv&#xff0c;其中包含一个成员变量num和一个成员函数add()&#xff0c;add()实现num的递增。 另一个类Send通过信号槽或直接调用的方法调用Recv的add函数。 单独开一个线程Watcher&#xff0c;每秒计算num变量的增长数值&#xff0c;作为add函数被调…

STL中vector动态二维数组理解(杨辉三角)

题目链接&#xff1a;118.杨辉三角 题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目指要&#xff1a; 本题的主要目的是理解vector<vector<int&…

编译原理总结

编译器构成 1. 前端分析部分 1.1 词法分析 确定词性&#xff0c;输出为token序列 1.2 语法分析 识别短语 1.3 语义分析 分析短语在句子中的成分 IR中间代码生成 2. 机器无关代码优化 3. 后端综合部分 目标代码生成 机器相关代码优化 4. 其他 全局信息表 异常输出

电影推荐系统配置运行

电影推荐系统配置运行 代码地址项目介绍&#xff08;引自原文&#xff09; 环境创建新环境激活环境安装包创建管理员用户(可选)启动 代码地址 movie 项目介绍&#xff08;引自原文&#xff09; 本推荐系统采用的是分层模型设计思想&#xff0c;第一层为前端页面模型设计&…

2024.6.5

1、react原理学习&#xff0c; hook、fiber 2、瀑布流组件完善 3、代码随想录二刷

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU

持续学习&持续更新中… 学习态度&#xff1a;守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU 接口文档地址三级分类效果图建表后台组建数据的树形结构在人人(后台管理系统)中实现管理商品的三级分类路径规则使用…

DRIVEN|15分的CNN+LightGBM怎么做特征分类,适用于转录组

说在前面 今天分享一篇做深度学习模型的文章&#xff0c;这是一篇软硬结合的研究&#xff0c;排除转换实体产品&#xff0c;我们做生信基础研究的可以学习模仿这个算法&#xff0c;适用且不局限于临床资料&#xff0c;转录组数据&#xff0c;GWAS数据。 今天给大家分享的一篇文…

创新入门|营销中的视频内容:不可或缺的策略

视频在营销中日益重要。你是否也发现,视频内容最近似乎无处不在?它占据着社交媒体的推文、网站首页,甚至电子邮件中的位置。事实上,并不是你一个人有这样的感受。在过去十年中,视频作为一种营销手段日益成熟和强大。这是因为,人类天生就是视觉动物。我们大脑处理视觉信息的速度…

补上缺失的一环----一种数据库系统主动对外推送表的增删改实时变动数据的实践

在实践中&#xff0c;一些应用程序或模块需要实时获取某些数据库表的增删改变动数据。 对此需求&#xff0c;常见的方案有: 1、应用程序通过轮循查询数据库方式获取数据库表的增删改变动数据. 2、应用程序在把数据写入数据库表之前&#xff0c;通过事件方式向外通知数据库表的增…

安徽某高校数据挖掘作业6

1 根据附件中year文件&#xff0c;编辑Python程序绘制年销售总额分布条形图和年净利润分布条形图&#xff0c;附Python程序和图像。 2 根据附件中quarter和quarter_b文件&#xff0c;编辑Python程序绘制2018—2020年销售额和净利润折线图&#xff0c;附Python程序和图像。 3 …

城市之旅:使用 LLM 和 Elasticsearch 简化地理空间搜索(二)

我们在之前的文章 “城市之旅&#xff1a;使用 LLM 和 Elasticsearch 简化地理空间搜索&#xff08;一&#xff09;”&#xff0c;在今天的练习中&#xff0c;我将使用本地部署来做那里面的 Jupyter notebook。 安装 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasti…

C#-foreach循环语句

foreach循环语句 语法&#xff1a; foreach(数据类型 变量名 in 数组或集合对象) { 语句块; } foreach 会在每次循环的过程中&#xff0c;依次从数组或集合对象中取出一个新的元素放foreach( )里定义的变量中&#xff0c;直到所有元素都成功取出后退出循环。 foreach循环…

[AI资讯·0605] GLM-4系列开源模型,OpenAI安全疑云,ARM推出终端计算子系统,猿辅导大模型备案……

AI资讯 1毛钱1百万token&#xff0c;写2遍红楼梦&#xff01;国产大模型下一步还想卷什么&#xff1f;AI「末日」突然来临&#xff0c;公司同事集体变蠢&#xff01;只因四大聊天机器人同时宕机OpenAI员工们开始反抗了&#xff01;AI手机PC大爆发&#xff0c;Arm从软硬件到生态…

搭建大型分布式服务(三十九)SpringBoot 整合多个kafka数据源-支持Aware模式

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

【成品设计】基于物联网技术的养老院老人健康监控系统的设计与实现

《基于物联网技术的养老院老人健康监控系统的设计与实现》 老年人监护系统的核心任务是分析老年人在日常生活中是否存在意外事件和异常行为并提供相关帮助。正确分析出老年人的突发意外和行为异常&#xff0c;不仅可以有效地降低老年人因意外事故造成的生命风险&#xff0c;还…