机器学习——随机森林算法分类问题案例解析(sklearn)

1. 集成学习:三个臭皮匠,如何赛过诸葛亮?

我们之前学习的线性回归、决策树等算法,就像是团队里的某一位“专家”。这位专家可能在某个领域很擅长,但单凭他一人,要解决复杂多变的问题,总会遇到瓶颈。就好比,一位再厉害的“诸葛亮”,也难免有失算的时候。

那怎么办呢?古人云:“三个臭皮匠,赛过诸葛亮”。**集成学习(Ensemble Learning)**的核心思想正是如此:它不依赖于某一个“超级天才”(强学习器),而是将一群“普通人”(弱学习器)的智慧汇集起来,形成一个决策能力超强的“专家团”(强学习器)。

一个弱学习器,通常指那些性能仅比随机猜测好一点点的模型。而一个成功的“专家团”需要满足两个关键条件:

  1. 个体优秀 (Good):团队里的每个成员(弱学习器)都得有两把刷子,至少得具备一定的判断能力(比如,分类准确率要大于50%)。
  2. 彼此差异 (Different):如果团队成员的想法和知识背景一模一样,那和一个人决策没区别。成员之间必须有差异性、能互补短长,这样集成的效果才会最好。

为了组建这样的“专家团”,我们主要有两种策略,可以从两个维度来理解:

维度一:团队成员的构成方式 (同质 vs. 异质)

  • 异质集成 (Heterogeneous Ensemble):这就像组建一个“跨学科团队”。团队里有搞数学的(线性回归)、搞分类的(决策树)、搞空间分析的(K近邻)等等。我们让每个不同类型的模型都对问题进行预测,然后给那些历史表现更好的“专家”更高的发言权(权重),最后综合所有人的加权意见,得出最终结论。
  • 同质集成 (Homogeneous Ensemble):这就像组建一个“专科攻坚小组”,所有成员都是同一类型,比如全是决策树专家。为了避免大家想法一致,我们会给每个专家分发略有不同的“资料包”(搅动数据)。通过这种方式,即使模型类型相同,他们学到的侧重点也各不相同,从而保证了差异性。

维度二:团队的工作模式 (并行 vs. 串行)

  • 并行集成 (Parallel Ensemble):大家“同时开工,独立思考”。就像一场开卷考试,我们给每个学生(弱学习器)发一份略有不同的复习资料(通过自助采样得到的数据子集),让他们独立完成整套试卷。最后,我们统计所有学生的答案,通过“民主投票”来决定最终答案。这种方式互不干扰,非常适合大规模并行计算。

    • 代表算法装袋法 (Bagging) 和 随机森林 (Random Forest)
  • 串行集成 (Serial Ensemble):大家“接力工作,查漏补缺”。第一位同学(弱学习器)先做一遍题,然后把做错的题目标记出来。第二位同学拿到后,就重点攻克上一位同学搞错的难题。以此类推,每一位新成员都致力于解决前面所有成员留下的“历史遗留问题”。这样层层递进,模型的能力越来越强。

    • 代表算法提升法 (Boosting),如 AdaBoost, GBDT, XGBoost 等。
分类维度类型核心思想工作模式代表算法比喻
按构成异质集成不同类型的模型组合各自预测,加权表决Stacking跨学科专家会诊
同质集成同一类型的模型组合通过数据扰动创造差异Bagging, Boosting决策树专家小组
按生成并行集成独立、互不依赖同时训练,投票/平均Bagging, 随机森林学生独立完成考试
串行集成依赖、层层递进迭代训练,弥补前序错误Boosting (AdaBoost, GBDT)师徒接力解决难题

2. 随机森林分类任务:民主投票的决策专家团

随机森林是同质并行集成的杰出代表。顾名思义,“森林”由大量的“树”(决策树)组成。下面我们来看看这个“专家团”是如何工作的。

工作流程:

  1. 建造森林:有控制的“随机”

    • 样本随机 (Bootstrap Sampling):假设我们有1000个原始样本。为了训练第一棵树,我们从这1000个样本中有放回地随机抽取1000次,形成一个训练集。因为是有放回的,所以这个新的训练集中,有些样本可能出现多次,有些则一次都未出现。这个过程就像是为每个专家准备一份独特的“复习资料”。
    • 特征随机 (Feature Sampling):在决策树的每个节点进行分裂时,我们不是从全部 P 个特征中寻找最优分裂点,而是随机抽取 m 个特征(m < P),再从这 m 个中选出最好的。这确保了每棵树都不会过分依赖某几个强特征,增加了树之间的“视角”差异。
      • 经验法则:对于分类任务,通常取 m ≈ √p;对于回归任务,取 m ≈ p/3
      • 与装袋法(Bagging)的关系:如果设置 m = p,即每次都考虑所有特征,那随机森林就退化成了装袋法。所以说,随机森林是装袋法的一种“进阶版”,它通过增加特征随机性来进一步提升模型的多样性。
  2. 独立训练:并行工作的专家
    每棵决策树都使用自己独特的样本集和特征子集进行独立训练,互不干扰。

  3. 集中决策:少数服从多数
    当一个新的样本需要预测时,森林里的每一棵树都独立地给出一个自己的分类判断。最后,随机森林采用“多数投票 (Majority Voting)”原则,得票最多的那个类别就是最终的预测结果。

优点与缺点:

  • 优点
    • 高准确率与抗过拟合:通过平均/投票多棵树的结果,个别树的错误会被其他树纠正,使得整体模型非常稳健,不易过拟含。
    • 处理高维数据:即使有数千个特征,随机森林也能表现良好,并且能帮我们评估哪些特征更重要。
    • 易于并行化:各棵树的训练可以分散到多个CPU核心或机器上,效率很高。
  • 缺点
    • 可解释性较差:相对于单棵决策树,由成百上千棵树组成的“黑箱”模型,我们很难直观地理解其内部的决策逻辑。(这催生了下面要讲的解释性工具!
    • 计算成本:对于大数据集,训练大量的树会消耗较多的时间和内存。

3. 谁是MVP?解密随机森林的特征重要性

随机森林是一个“黑箱”,但我们依然有办法窥探其内部,比如,搞清楚“在所有决策中,哪个特征的贡献最大?” 这就像评选一支球队的“最有价值球员 (MVP)”。

核心思想:一个特征越重要,意味着它在分裂决策树节点时,起到的“让数据变纯粹”的作用越大。

计算方法

  1. 单棵树的贡献:在一棵决策树中,每当一个特征被用来分裂节点时,我们会计算这次分裂带来的“不纯度下降量”(例如,基尼指数下降或信息增益提升)。把这个特征在这棵树里所有分裂点的贡献加起来,就是它在这棵树里的重要性得分。
  2. 整个森林的总评:将该特征在森林中所有树上的重要性得分进行平均,就得到了它在整个随机森林中的最终重要性排名。

一句话总结:一个特征的重要性,就是它在所有树中、所有分裂决策里,平均贡献度的总和。贡献越大,排名越靠前,它就是我们模型眼中的“MVP”。


4. 不止看“谁”重要,更要看“如何”重要:模型的可解释性利器

特征重要性告诉我们“哪些”特征是MVP,但没有告诉我们这个MVP“如何”影响比赛结果的(例如,是得分能力强还是防守能力强?)。部分依赖图 (PDP) 和 个体条件期望图 (ICE) 就是为了回答“如何影响”这个问题的强大工具。

1. 部分依赖图 (Partial Dependence Plot, PDP):看清“平均趋势”

  • 解决的问题:它展示了当其他所有特征保持不变时,某一个特征值的变化,对模型平均预测结果的影响。
  • 比喻:就像研究“咖啡因摄入量”对“所有学生平均专注度”的影响。我们想知道,是咖啡因越多越好,还是适量最好?
  • 工作原理
    1. 选择一个你感兴趣的特征,比如“年龄”。
    2. 固定住数据集中其他所有特征,然后强制让所有样本的“年龄”都等于20岁,计算出所有样本的平均预测概率。
    3. 接着,强制让所有样本的“年龄”都等于21岁,再算一个平均预测概率。
    4. …以此类推,将不同年龄值对应的平均预测结果连接起来,就形成了一条曲线。
  • 解读:这条曲线展示了“年龄”这个特征对模型预测结果的边际效应。我们可以直观地看到,随着年龄的增长,预测结果是线性上升、下降,还是呈现更复杂的关系。

2. 个体条件期望图 (Individual Conditional Expectation, ICE Plot):洞察“个体故事”

  • 解决的问题:PDP展示的是平均效果,但这种“平均”可能会掩盖个体之间的巨大差异。ICE图则为每一个样本都画出一条线,展示特定特征的变化对该样本预测结果的影响。
  • 比喻:PDP是看咖啡因对“所有学生”的平均影响,而ICE图是看咖啡因对“张三”、“李四”每个人专注度的具体影响。可能张三喝了咖啡生龙活虎,李四喝了却心慌意乱。
  • 工作原理:它和PDP的原理几乎一样,唯一的区别是——它不对所有样本的预测结果求平均。它为每个样本单独画出一条“特征-预测”关系曲线。
  • 解读
    • ICE图是PDP的“拆解版”。所有ICE曲线的平均线,就是PDP曲线
    • 通过观察ICE图,我们可以发现是否存在一些行为特异的子群体。如果所有ICE曲线都大致平行,说明该特征对所有样本的影响是同质的。如果曲线杂乱无章,说明存在复杂的交互效应。

一句话总结

  • 特征重要性:告诉你哪个特征是MVP。
  • PDP:告诉你这位MVP对**整个团队(所有样本)**的平均影响是怎样的。
  • ICE:告诉你这位MVP对**每一位队员(单个样本)**的具体影响是怎样的。

数据13.1中的数据为例进行讲解。针对“数据13.1”,我们以credit(是否发生违约)为响应变量,以age(年龄)、education(受教育程度)、workyears(工作年限)、resideyears(居住年限)、income(年收入水平)、debtratio(债务收入比)、creditdebt(信用卡负债)、otherdebt(其他负债)为特征变量,使用分类随机森林算法进行。

5.随机森林算法分类问题案例解析

1  变量设置及数据处理

from sklearn.ensemble import RandomForestClassifierfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.metrics import confusion_matrixfrom sklearn.metrics import classification_reportfrom sklearn.metrics import cohen_kappa_scorefrom sklearn.inspection import PartialDependenceDisplayfrom mlxtend.plotting import plot_decision_regions#分类问题随机森林算法示例#1  变量设置及数据处理data=pd.read_csv('数据13.1.csv')X = data.iloc[:,1:]#设置特征变量y = data.iloc[:,0]#设置响应变量X_train, X_test, y_train, y_test =  train_test_split(X,y,test_size=0.3, stratify=y, random_state=10)

2  二元Logistic回归、单颗分类决策树算法对比观察

#2  二元Logistic回归、单颗分类决策树算法观察model =  LogisticRegression(C=1e10, max_iter=1000,fit_intercept=True)model.fit(X_train, y_train)model.score(X_test, y_test)#单颗分类决策树算法model = DecisionTreeClassifier()path = model.cost_complexity_pruning_path(X_train, y_train)param_grid = {'ccp_alpha': path.ccp_alphas}kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=10)model = GridSearchCV(DecisionTreeClassifier(random_state=10), param_grid, cv=kfold)model.fit(X_train, y_train)print("最优alpha值:", model.best_params_)     model = model.best_estimator_print("最优预测准确率:", model.score(X_test, y_test))

最优alpha值:{'ccp_alpha': 0.004534462760155709}

最优预测准确率:0.861904761904762

3  装袋法分类算法

# 3  装袋法分类算法model=BaggingClassifier(estimator=DecisionTreeClassifier(random_state=10),n_estimators=300,max_samples=0.8,random_state=0)model.fit(X_train, y_train)model.score(X_test, y_test)

0.8666666666666667

4  随机森林分类算法

# 4  随机森林分类算法model = RandomForestClassifier(n_estimators=300, max_features='sqrt', random_state=10)model.fit(X_train, y_train)model.score(X_test, y_test)

5  寻求max_features最优参数

#5  寻求max_features最优参数scores = []for max_features in range(1, X.shape[1] + 1):    model = RandomForestClassifier(max_features=max_features,                                  n_estimators=300, random_state=10)    model.fit(X_train, y_train)    score = model.score(X_test, y_test)    scores.append(score)index = np.argmax(scores)range(1, X.shape[1] + 1)[index]plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文plt.plot(range(1, X.shape[1] + 1), scores, 'o-')plt.axvline(range(1, X.shape[1] + 1)[index], linestyle='--', color='k', linewidth=1)plt.xlabel('最大特征变量数')plt.ylabel('最优预测准确率')plt.title('预测准确率随选取的最大特征变量数变化情况')plt.show()plt.savefig('预测准确率随选取的最大特征变量数变化情况.png')print(scores)

图片

6  寻求n_estimators最优参数

#6  寻求n_estimators最优参数ScoreAll = []for i in range(100,300,10):    model= RandomForestClassifier(max_features=2,n_estimators = i,random_state = 10)    model.fit(X_train, y_train)    score = model.score(X_test, y_test)    ScoreAll.append([i,score])ScoreAll = np.array(ScoreAll)print(ScoreAll)max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] #找出最高得分对应的索引print("最优参数以及最高得分:",ScoreAll[max_score])  plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文plt.figure(figsize=[20,5])plt.xlabel('n_estimators')plt.ylabel('预测准确率')plt.title('预测准确率随n_estimators变化情况')plt.plot(ScoreAll[:,0],ScoreAll[:,1])plt.show()plt.savefig('预测准确率随n_estimators变化情况.png')

图片

进一步寻求n_estimators最优参数

#进一步寻求n_estimators最优参数ScoreAll = []for i in range(190,210):    model= RandomForestClassifier(max_features=2,n_estimators = i,random_state = 10)    model.fit(X_train, y_train)    score = model.score(X_test, y_test)    ScoreAll.append([i,score])ScoreAll = np.array(ScoreAll)print(ScoreAll)max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] #找出最高得分对应的索引print("最优参数以及最高得分:",ScoreAll[max_score])  plt.figure(figsize=[20,5])plt.xlabel('n_estimators')plt.ylabel('预测准确率')plt.title('预测准确率随n_estimators变化情况')plt.plot(ScoreAll[:,0],ScoreAll[:,1])plt.show()plt.savefig('预测准确率随n_estimators变化情况.png')

图片

7  随机森林特征变量重要性水平分析​​​​

# 7  随机森林特征变量重要性水平分析sorted_index = model.feature_importances_.argsort()plt.rcParams['font.sans-serif'] = ['SimHei']#解决图表中中文显示问题plt.barh(range(X_train.shape[1]), model.feature_importances_[sorted_index])plt.yticks(np.arange(X_train.shape[1]), X_train.columns[sorted_index])plt.xlabel('特征变量重要性水平')plt.ylabel('特征变量')plt.title('随机森林特征变量重要性水平分析')plt.tight_layout()plt.show()plt.savefig('随机森林特征变量重要性水平分析.png')

图片

8  绘制部分依赖图与个体条件期望图​​​​​​​

#8  绘制部分依赖图与个体条件期望图PartialDependenceDisplay.from_estimator(model, X_train, ['workyears','debtratio'], kind='average')#绘制部分依赖图简称PDP图PartialDependenceDisplay.from_estimator(model, X_train, ['workyears','debtratio'],kind='individual')#绘制个体条件期望图(ICE Plot)PartialDependenceDisplay.from_estimator(model, X_train, ['workyears','debtratio'],kind='both')#绘制个体条件期望图(ICE Plot)plt.show()plt.savefig('部分依赖图与个体条件期望图.png')

图片

9  模型性能评价

#9  模型性能评价prob = model.predict_proba(X_test)prob[:5]pred = model.predict(X_test)pred[:5]print(classification_report(y_test,pred))cohen_kappa_score(y_test, pred)#计算kappa得分

图片

热力图

#热力图import seaborn as snssns.heatmap(confusion_matrix(y_test, pred), annot=True, fmt='d', cmap='Blues')plt.show()plt.savefig('混淆矩阵热力图.png')

图片

10  绘制ROC曲线

​​​​​​​

#10  绘制ROC曲线plt.rcParams['font.sans-serif'] = ['SimHei']#解决图表中中文显示问题from sklearn.metrics import roc_curve,roc_auc_score
# 假设 y_true 和 y_score 是你的真实标签和模型预测的概率得分predict_target_prob=model.predict_proba(X_test)fpr, tpr, thresholds = roc_curve(y_test, predict_target_prob[:,1])# 计算AUC值auc = roc_auc_score(y_test, predict_target_prob[:,1])print("AUC值:", auc)# 绘制 ROC 曲线plt.plot(fpr, tpr, label='ROC Curve area=%.3f'%auc)plt.plot(fpr, fpr, 'k--', linewidth=1)plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title('随机森林分类树算法ROC曲线')plt.legend()plt.show()plt.savefig('随机森林分类树算法ROC曲线.pdf')

图片

11  运用两个特征变量绘制随机森林算法决策边界图

#11  运用两个特征变量绘制随机森林算法决策边界图X2 = X.iloc[:, [2,5]]#仅选取workyears、debtratio作为特征变量model = RandomForestClassifier(n_estimators=300, max_features=1, random_state=1)model.fit(X2,y)model.score(X2,y)plot_decision_regions(np.array(X2), np.array(y), model)plt.xlabel('debtratio')#将x轴设置为'debtratio'plt.ylabel('workyears')#将y轴设置为'workyears'plt.title('随机森林算法决策边界')#将标题设置为'随机森林算法决策边界'plt.show()plt.savefig('随机森林算法决策边界.png')

图片

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

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

相关文章

Mermaid流程图

手动画流程图太复杂了&#xff0c;用极少的字符生成图表是人生的梦想。 Mermaid Chart - Create complex, visual diagrams with text. A smarter way of creating diagrams. Linux开始菜单流程图 flowchartA(["StartMenu"]) --> B["/usr/share/applicati…

Compose笔记(三十八)--CompositionLocal

这一节主要了解一下CompositionLocal&#xff0c;CompositionLocal是Jetpack Compose中用于组件树内隐式数据传递的核心机制&#xff0c;其设计初衷是解决跨多层组件的数据共享问题&#xff0c;避免通过函数参数逐层传递数据。简单总结:API: (1)compositionLocalOf<T>创建…

解决uniapp 使用uview生成小程序包太大无法上传的问题

直接打包的插件内容优化后完美上传&#xff0c; 相信眼尖的小伙伴已经发现了问题的关键 uview 会在每个组件里重复引css。导致包太大。 并且 它的格式是 data-v-哈希 没法简单的处理 需要压缩通用规则。然后 再引用压缩后的规则例如是然后 成功上传

在线工具+网页平台来学习和操作Python与Excel相关技能

&#x1f517;一、在线平台推荐&#xff08;免安装&#xff09; ✅Python平台&#xff08;直接写代码、跑结果&#xff09;&#xff1a; 平台 优点 地址 Google Colab 免费&#xff0c;支持图表和文件操作&#xff0c;最推荐 https://colab.research.google.com …

R Excel 文件处理指南

R Excel 文件处理指南 引言 R语言作为一种强大的统计计算和图形展示工具&#xff0c;在数据分析领域有着广泛的应用。而Excel作为办公软件的佼佼者&#xff0c;在数据记录和计算中也扮演着重要的角色。本文旨在介绍如何使用R语言处理Excel文件&#xff0c;包括读取、写入以及数…

亿级流量短剧平台架构演进:高并发场景下的微服务设计与性能调优

一、短剧系统概述与市场背景短剧作为一种新兴的内容形式&#xff0c;近年来在移动互联网领域迅速崛起。根据最新市场数据显示&#xff0c;2023年中国短剧市场规模已突破300亿元&#xff0c;用户规模达到4.5亿&#xff0c;平均每日观看时长超过60分钟。这种爆发式增长催生了对专…

4G手机控车模块的核心功能与应用价值

4G手机控车模块是基于4G无线通信技术实现车辆远程监控、控制及数据交互的嵌入式设备。其核心功能包括通过4G网络实现高速数据传输&#xff08;支持TCP/IP协议&#xff09;、远程参数配置与设备管理、多网络制式兼容&#xff0c;集成GPS/北斗定位功能&#xff0c;可实时获取车辆…

【leetGPU】1. Vector Addition

问题 link: https://leetgpu.com/challenges/vector-addition Implement a program that performs element-wise addition of two vectors containing 32-bit floating point numbers on a GPU. The program should take two input vectors of equal length and produce a si…

瑞吉外卖学习笔记

TableField 作用: 当数据库中表的列名与实体类中的属性名不一致&#xff0c;使用TableField 使其对应 TableField("db_column_name") private String entityFieldName;exist 属性 : 指定该字段是否参与增删改查操作。 TableField(exist false) private String tempF…

RoPE:相对位置编码的旋转革命——原理、演进与大模型应用全景

“以复数旋转解锁位置关系的本质表达&#xff0c;让Transformer突破长度藩篱” 旋转位置编码&#xff08;Rotary Position Embedding, RoPE&#xff09; 是由 Jianlin Su 等研究者 于2021年提出的突破性位置编码方法&#xff0c;通过复数空间中的旋转操作将相对位置信息融入Tra…

震网(Stuxnet):打开潘多拉魔盒的数字幽灵

在科技飞速发展的今天&#xff0c;代码和数据似乎只存在于无形的数字世界。但如果我告诉大家&#xff0c;一段代码曾悄无声息地潜入一座受到严密物理隔离的核工厂&#xff0c;并成功摧毁了其中的物理设备&#xff0c;大家是否会感到一丝寒意&#xff1f;这不是科幻电影的情节&a…

一文读懂:到底什么是 “具身智能” ?

今天咱们来好好聊聊一个最近很火的一个技术话题——具身智能&#xff01; 这个词听起来是不是有点难懂&#xff1f;其实我们可以简单理解为&#xff1a;具身智能是具有身体的人工智能体。这样是不是会容易理解一些&#xff1f; 具身智能&#xff08;Embodied Intelligence&…

企业级区块链平台Hyperchain核心原理剖析

Hyperchain作为国产自主可控的企业级联盟区块链平台&#xff0c;其核心原理围绕高性能共识、隐私保护、智能合约引擎及可扩展架构展开&#xff0c;通过多模块协同实现企业级区块链网络的高效部署与安全运行。 以下从核心架构、关键技术、性能优化、安全机制、应用场景五个维度展…

论文阅读-RaftStereo

文章目录1 概述2 模块说明2.1 特征抽取器2.2 相关金字塔2.3 多级更新算子2.4 Slow-Fast GRU2.5 监督3 效果1 概述 在双目立体匹配中&#xff0c;基于迭代的模型是一种比较主流的方法&#xff0c;而其鼻祖就是本文要讲的RaftStereo。 先来说下什么是双目立体匹配。给定极线矫正…

内存优化:从堆分配到零拷贝的终极重构

引言 在现代高性能软件开发中&#xff0c;内存管理往往是性能优化的关键战场。频繁的堆内存分配(new/delete)不仅会导致性能下降&#xff0c;还会引发内存碎片化问题&#xff0c;严重影响系统稳定性。本文将深入剖析高频调用模块中堆分配泛滥导致的性能塌方问题&#xff0c;并…

【GoLang#2】:基础入门(工具链 | 基础语法 | 内置函数)

前言&#xff1a;Go 的一些必备知识 1. Go 语言命名 Go的函数、变量、常量、自定义类型、包(package)的命名方式遵循以下规则&#xff1a; 首字符可以是任意的Unicode字符或者下划线剩余字符可以是Unicode字符、下划线、数字字符长度不限 Go 语言代码风格及开发事项代码每一行结…

Bert项目--新闻标题文本分类

目录 技术细节 1、下载模型 2、config文件 3、BERT 文本分类数据预处理流程 4、对输入文本进行分类 5、计算模型的分类性能指标 6、模型训练 7、基于BERT的文本分类预测接口 问题总结 技术细节 1、下载模型 文件名称--a0_download_model.py 使用 ModelScope 库从模型仓…

sendfile系统调用及示例

好的&#xff0c;我们继续学习 Linux 系统编程中的重要函数。这次我们介绍 sendfile 函数&#xff0c;它是一个高效的系统调用&#xff0c;用于在两个文件描述符之间直接传输数据&#xff0c;通常用于将文件内容发送到网络套接字&#xff0c;而无需将数据从内核空间复制到用户空…

数据结构习题--删除排序数组中的重复项

数据结构习题–删除排序数组中的重复项 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 方法&…

Docker的容器设置随Docker的启动而启动

原因也比较简单&#xff0c;在docker run 的时候没有设置–restartalways参数。 容器启动时&#xff0c;需要增加参数 –restartalways no - 容器退出时&#xff0c;不重启容器&#xff1b; on-failure - 只有在非0状态退出时才从新启动容器&#xff1b; always - 无论退出状态…