机器学习基础之《分类算法(6)—决策树》

一、决策树

1、认识决策树
决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法

2、一个对话的例子

想一想这个女生为什么把年龄放在最上面判断!!!
如何高效的进行决策?特征的先后顺序

二、决策树分类原理详解

1、我们通过一个问题例子

已知有四个特征值,预测是否贷款给某个人
(1)先看房子,再看工作 --> 是否贷款(只看了两个特征)
(2)年龄,信贷情况,工作 --> 看了三个特征
第二种这种方式就没有第一种高效
希望能够找到一种数学的方法,快速自动的判断,应该先看哪个特征

2、信息论基础
需要引入信息熵、信息增益等信息论的知识!!!

(1)信息
香农定义的:消除随机不定性的东西
小明 年龄 "我今年18岁"
小华 "小明明年19岁"

小明说了之后,小华说的这句话就变成废话了,不是信息

(2)信息的衡量 -- 信息量 -- 信息熵

3、信息熵的定义
H的专业术语称之为信息熵,单位为比特bit

4、以银行贷款数据为例,计算信息熵
某人,已知年龄、工作、房子、信贷情况,是否贷款给这个人?
需要衡量不确定性的大小
这里有两种情况,一种是贷款,一种是不贷款
不贷款的概率是6/15,贷款的概率是9/15
H(总) = -(6/15 * log 6/15 + 9/15 * log 9/15) = 0.971

当我们知道某一个特征之后,不确定性会减少
那么我们如果能求出,知道某个特征之后,不确定性减少的程度。再比较,知道哪一个特征之后,不确定性减少的程度是最多的。我们是不是可以先看这个特征

求当知道某个特征之后,它的信息熵是多少?
引入—信息增益

5、信息增益
决策树的划分依据之一—信息增益

(1)定义和公式
特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差
g(D,A) = H(D) - 条件熵H(D|A)
信息增益就衡量了,知道某个特征之后,它的不确定性的减少程度

计算知道年龄之后的信息增益是多少:
g(D,年龄) = H(D) - H(D|年龄)

求H(D|年龄):
H(青年) = -(2/5 * log 2/5 + 3/5 * log 3/5) = 
H(中年) = -(2/5 * log 2/5 + 3/5 * log 3/5) = 
H(老年) = -(1/5 * log 1/5 + 4/5 * log 4/5) = 
H(D|年龄) = 1/3 * H(青年) + 1/3 * H(中年) + 1/3 * H(老年)

我们以A1、A2、A3、A4代表年龄、有工作、有自己的房子和贷款情况。最终计算的结果g(D, A1) = 0.313, g(D, A2) = 0.324, g(D, A3) = 0.420,g(D, A4) = 0.363。所以我们选择A3作为划分的第一个特征

(2)公式

(3)当然决策树的原理不止信息增益这一种,还有其他方法
ID3:
  信息增益,最大的准则
C4.5:
  信息增益比,最大的准则
CART:
  分类树:基尼系数,最小的准则,在sklearn中可以选择划分的默认原则
  优势:划分更加细致(从后面的例子来理解)

三、决策树API

1、API
class sklearn.tree.DecisionTreeClassifier(criterion='gini', max_depth=None, random_state=None)
决策树分析器
criterion:默认是'gini'系数,也可以选择信息增益的熵'entropy'
max_depth:树的深度大小
  树的深度太大,会过拟合
  过拟合会导致模型泛化能力差,即过度适合当前样本集而缺乏适应(预测)新样本的能力
random_state:随机数种子

2、决策树对鸢尾花分类

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifierdef KNN_iris():"""用KNN算法对鸢尾花进行分类"""# 1、获取数据iris = load_iris()print("iris.data:\n", iris.data)print("iris.target:\n", iris.target)# 2、划分数据集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)# 3、特征工程:标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)# 用训练集的平均值和标准差对测试集的数据来标准化# 这里测试集和训练集要有一样的平均值和标准差,而fit的工作就是计算平均值和标准差,所以train的那一步用fit计算过了,到了test这就不需要再算一遍自己的了,直接用train的就可以x_test = transfer.transform(x_test)# 4、KNN算法预估器estimator = KNeighborsClassifier(n_neighbors=3)estimator.fit(x_train, y_train)# 5、模型评估# 方法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)return Nonedef KNN_iris_gscv():"""用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证"""# 1、获取数据iris = load_iris()print("iris.data:\n", iris.data)print("iris.target:\n", iris.target)# 2、划分数据集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)# 3、特征工程:标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)# 用训练集的平均值和标准差对测试集的数据来标准化# 这里测试集和训练集要有一样的平均值和标准差,而fit的工作就是计算平均值和标准差,所以train的那一步用fit计算过了,到了test这就不需要再算一遍自己的了,直接用train的就可以x_test = transfer.transform(x_test)# 4、KNN算法预估器estimator = KNeighborsClassifier()# 加入网格搜索和交叉验证# 参数准备param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)estimator.fit(x_train, y_train)# 5、模型评估# 方法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)#最佳参数:best_params_print("最佳参数:\n", estimator.best_params_)#最佳结果:best_score_print("最佳结果:\n", estimator.best_score_)#最佳估计器:best_estimator_print("最佳估计器:\n", estimator.best_estimator_)#交叉验证结果:cv_results_print("交叉验证结果:\n", estimator.cv_results_)return Nonedef nb_news():"""用朴素贝叶斯算法对新闻进行分类"""# 1、获取数据news = fetch_20newsgroups(subset="all")# 2、划分数据集x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)# 3、特征工程:文本特征抽取-tfidftransfer = TfidfVectorizer()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4、朴素贝叶斯算法预估器流程estimator = MultinomialNB()estimator.fit(x_train, y_train)# 5、模型评估# 方法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)return Nonedef decision_iris():"""用决策树对鸢尾花数据进行分类"""# 1、获取数据集iris = load_iris()# 2、划分数据集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)# 3、决策树预估器estimator = DecisionTreeClassifier(criterion='entropy')estimator.fit(x_train, y_train)# 4、模型评估# 方法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)return Noneif __name__ == "__main__":# 代码1:用KNN算法对鸢尾花进行分类KNN_iris()# 代码2:用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证#KNN_iris_gscv()# 代码3:用朴素贝叶斯算法对新闻进行分类#nb_news()# 代码4:用决策树对鸢尾花数据进行分类decision_iris()

运行结果:

y_predict:[0 2 0 0 2 1 1 0 2 1 2 1 2 2 1 1 2 1 1 0 0 2 0 0 1 1 1 2 0 1 0 1 0 0 1 2 12]
直接比对真实值和预测值:[ True  True  True  True  True  True False  True  True  True  True  TrueTrue  True  True False  True  True  True  True  True  True  True  TrueTrue  True  True  True  True  True  True  True  True  True False  TrueTrue  True]
准确率为:0.9210526315789473
y_predict:[0 2 0 0 2 1 1 0 2 1 2 1 2 2 1 1 2 1 1 0 0 2 0 0 1 1 1 2 0 1 0 1 0 0 1 2 12]
直接比对真实值和预测值:[ True  True  True  True  True  True False  True  True  True  True  TrueTrue  True  True False  True  True  True  True  True  True  True  TrueTrue  True  True  True  True  True  True  True  True  True False  TrueTrue  True]
准确率为:0.9210526315789473

KNN是一种懒惰算法,在计算的时候,它在内存里疯狂的计算跟每个样本之间的距离
决策树应用场景更适合运用在数据量比较大的情况下

四、决策树的可视化

1、保存树的结构到dot文件
sklearn.tree.export_graphviz()
该函数能够导出DOT格式

2、tree.export_graphviz(estimator, out_file='tree.dot', feature_names=['',''])
estimator:预估器对象
out_file:导出的名字
feature_names:特征的名字

3、修改代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier, export_graphvizdef KNN_iris():"""用KNN算法对鸢尾花进行分类"""# 1、获取数据iris = load_iris()print("iris.data:\n", iris.data)print("iris.target:\n", iris.target)# 2、划分数据集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)# 3、特征工程:标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)# 用训练集的平均值和标准差对测试集的数据来标准化# 这里测试集和训练集要有一样的平均值和标准差,而fit的工作就是计算平均值和标准差,所以train的那一步用fit计算过了,到了test这就不需要再算一遍自己的了,直接用train的就可以x_test = transfer.transform(x_test)# 4、KNN算法预估器estimator = KNeighborsClassifier(n_neighbors=3)estimator.fit(x_train, y_train)# 5、模型评估# 方法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)return Nonedef KNN_iris_gscv():"""用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证"""# 1、获取数据iris = load_iris()print("iris.data:\n", iris.data)print("iris.target:\n", iris.target)# 2、划分数据集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)# 3、特征工程:标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)# 用训练集的平均值和标准差对测试集的数据来标准化# 这里测试集和训练集要有一样的平均值和标准差,而fit的工作就是计算平均值和标准差,所以train的那一步用fit计算过了,到了test这就不需要再算一遍自己的了,直接用train的就可以x_test = transfer.transform(x_test)# 4、KNN算法预估器estimator = KNeighborsClassifier()# 加入网格搜索和交叉验证# 参数准备param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)estimator.fit(x_train, y_train)# 5、模型评估# 方法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)#最佳参数:best_params_print("最佳参数:\n", estimator.best_params_)#最佳结果:best_score_print("最佳结果:\n", estimator.best_score_)#最佳估计器:best_estimator_print("最佳估计器:\n", estimator.best_estimator_)#交叉验证结果:cv_results_print("交叉验证结果:\n", estimator.cv_results_)return Nonedef nb_news():"""用朴素贝叶斯算法对新闻进行分类"""# 1、获取数据news = fetch_20newsgroups(subset="all")# 2、划分数据集x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)# 3、特征工程:文本特征抽取-tfidftransfer = TfidfVectorizer()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4、朴素贝叶斯算法预估器流程estimator = MultinomialNB()estimator.fit(x_train, y_train)# 5、模型评估# 方法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)return Nonedef decision_iris():"""用决策树对鸢尾花数据进行分类"""# 1、获取数据集iris = load_iris()# 2、划分数据集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)# 3、决策树预估器estimator = DecisionTreeClassifier(criterion='entropy')estimator.fit(x_train, y_train)# 4、模型评估# 方法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)# 可视化决策树export_graphviz(estimator, out_file='iris_tree.dot', feature_names=iris.feature_names)return Noneif __name__ == "__main__":# 代码1:用KNN算法对鸢尾花进行分类#KNN_iris()# 代码2:用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证#KNN_iris_gscv()# 代码3:用朴素贝叶斯算法对新闻进行分类#nb_news()# 代码4:用决策树对鸢尾花数据进行分类decision_iris()

运行后生成iris_tree.dot文件:

digraph Tree {
node [shape=box] ;
0 [label="petal width (cm) <= 0.8\nentropy = 1.584\nsamples = 112\nvalue = [38, 38, 36]"] ;
1 [label="entropy = 0.0\nsamples = 38\nvalue = [38, 0, 0]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="petal width (cm) <= 1.65\nentropy = 0.999\nsamples = 74\nvalue = [0, 38, 36]"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
3 [label="sepal length (cm) <= 7.1\nentropy = 0.179\nsamples = 37\nvalue = [0, 36, 1]"] ;
2 -> 3 ;
4 [label="entropy = 0.0\nsamples = 36\nvalue = [0, 36, 0]"] ;
3 -> 4 ;
5 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 0, 1]"] ;
3 -> 5 ;
6 [label="petal length (cm) <= 5.05\nentropy = 0.303\nsamples = 37\nvalue = [0, 2, 35]"] ;
2 -> 6 ;
7 [label="sepal width (cm) <= 2.9\nentropy = 0.863\nsamples = 7\nvalue = [0, 2, 5]"] ;
6 -> 7 ;
8 [label="entropy = 0.0\nsamples = 4\nvalue = [0, 0, 4]"] ;
7 -> 8 ;
9 [label="petal width (cm) <= 1.75\nentropy = 0.918\nsamples = 3\nvalue = [0, 2, 1]"] ;
7 -> 9 ;
10 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
9 -> 10 ;
11 [label="sepal width (cm) <= 3.1\nentropy = 1.0\nsamples = 2\nvalue = [0, 1, 1]"] ;
9 -> 11 ;
12 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 0, 1]"] ;
11 -> 12 ;
13 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
11 -> 13 ;
14 [label="entropy = 0.0\nsamples = 30\nvalue = [0, 0, 30]"] ;
6 -> 14 ;
}

4、生成图像
http://webgraphviz.com
一直显示loading......

后来网上找到一个生成了
访问http://www.tasksteper.com:8099/flow/home/;以用户名/密码:testuser1/ testuser1登录;进入“集成工具”项目后;点击“创建条目”

5、判断过程
(1)先看花瓣的宽度,如果宽度小于等于0.8
(2)如果不满足,继续往下分
(3)entropy:计算信息增益
(4)samples:样本数量

五、决策树优缺点

1、有点
简单和易于理解,并且可以可视化
可视化—可解释能力强

2、缺点
树过于复杂,容易产生过拟合

3、改进
减枝cart算法,决策树API当中已经实现
随机森林
 

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

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

相关文章

APP备案您清楚了吗?

根据近日工业和信息化部发布的《工业和信息化部关于开展移动互联网应用程序备案工作的通知》要求&#xff0c;在中华人民共和国境内从事互联网信息服务的APP主办者&#xff0c;应当依照《中华人民共和国反电信网络诈骗法》《互联网信息服务管理办法》&#xff08;国务院令第292…

Java时间复杂度和空间复杂度(详解)

目录 1.复杂度分析 2.时间复杂度 大O的渐进表示法 3.空间复杂度 1.复杂度分析 当我们设计一个算法时&#xff0c;怎样衡量其好坏&#xff1f; 算法在编写为可执行程序后&#xff0c;运行时需要耗费时间资源和空间&#xff08;内存&#xff09;资源。因此&#xff0c;衡量一…

springboot+vue上传图片

这里是一个简单的示例&#xff0c;演示了如何在Spring Boot中从Vue.js上传图像&#xff1a; 1.前端Vue.js代码&#xff1a; <template><div><input type"file" change"handleFileUpload"><button click"uploadImage">…

java复习-线程的同步和死锁

线程的同步和死锁 同步问题引出 当多个线程访问同一资源时&#xff0c;会出现不同步问题。比如当票贩子A&#xff08;线程A&#xff09;已经通过了“判断”&#xff0c;但由于网络延迟&#xff0c;暂未修改票数的间隔时间内&#xff0c;票贩子B&#xff08;线程B&#xff09;…

SpringBoot-线程池ThreadPoolExecutor异步处理(包含拆分集合工具类)

ThreadPoolExecutor VS ThreadPoolTaskExecutor ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。 配置文件application.yml # 异步线程配置 自定义使用参数 async:executor:thread:core_pool_size: 10max_pool_size: 100 # 配置最大线程数queue_capacity: …

【css面试题】 实现一个盒子的水平竖直居中对齐效果

面试题里有时还会强调 子盒子宽高是否已知&#xff0c;要注意一下 尝试一&#xff1a;给父盒子设置padding 或者子盒子设置margin <style>.father{width: 300px;height: 200px;overflow: hidden; /* 放坑爹现象&#xff0c;不信你删了试试 */background-color: #db7b7b…

61、SpringBoot -----跨域资源的设置----局部设置和全局设置

★ 跨域资源共享的意义 ▲ 在前后端分离的开发架构中&#xff0c;前端应用和后端应用往往是彻底隔离的&#xff0c;二者不在同一个应用服务器内、甚至不再同一台物理节点上。 因此前端应用和后端应用就不在同一个域里。▲ 在这种架构下&#xff0c;前端应用可能采用前端框架&a…

【驱动开发】实现三盏灯的控制,编写应用程序测试

head.h #ifndef __HEAD_H__ #define __HEAD_H__//LED1:PE10 //LED2:PF10 //LED3:PE8#define LED_RCC 0X50000A28 //使能GPIO#define LED_MODER 0X50006000 //设置输出模式 #define LED_ODR 0X50006014 //设置输出高低电平#define LED2_MODER 0X50007000 …

【分布式计算】六、命名机制 Naming

1.基本思想&#xff1a;用于标记分布式系统中的实体 2.pure name:1、不能代表全部&#xff0c;随机字符串2、仅用于比较 3.identifier(ID)&#xff1a;一个ID对应一个实体、一个实体对应一个实体、ID永远对应同一实体 4.无层次命名&#xff08;Flat Naming&#xff09;   a.非…

JVM调优的GC日志观察解读

如果各项参数设置合理&#xff0c;系统没有超时日志出现&#xff0c;GC 频率不高&#xff0c;GC 耗时不高&#xff0c;那么没有必要进行 GC 优化 如果 GC 时间超过 1-3 秒&#xff0c;或者频繁 GC&#xff0c;则必须优化。 一、参数解读 Jvm 调优典型参数设置; -Xms: 堆内存的…

NEDC、WLTC、CLTC,三种汽车能源消耗测试标准有什么区别?

NEDC、WLTC、CLTC,三种汽车能源消耗测试标准有什么区别? 参考链接:https://cj.sina.com.cn/articles/view/1677177940/63f7b454027018pu2 2023 年 1 月,抱着对先进新能源汽车的数码设备充电配置兴趣,小编抽空参观了第二十届广州国际车展,详细可以看这篇稿件《走马观花逛广…

【5种数据结构的操作】RedisTemplate模版类!

RedisTemplate 是 Spring Data Redis 提供的一个操作 Redis 的模板类&#xff0c;它封装了 Redis 的操作&#xff0c;方便开发者进行 Redis 缓存操作。 可以使用Autowired注解直接调用&#xff01;&#xff01;&#xff01; Autowired private RedisTemplate redisTemplate; …

VMware vCenter 从6.7跨版本升级至7.0U3N

本文尝试使用 vCenter Server Appliance 管理界面 (VAMI) 进行对vCenter Server Appliance7应用进行小版本升级&#xff0c;从6.7.0.47000升级到7.0.3.01600&#xff08;7.0U3N&#xff09;。 一、升级前的准备工作 1、检查当前运行环境&#xff08;当前为6.7.0.47000&#x…

Git:git clone 之 --recursive 选项

在git的repo中&#xff0c;可能会有子项目的代码&#xff0c;也就是"git中的git" --recursive是递归的意思&#xff0c;不仅会git clone当前项目中的代码&#xff0c;也会clone项目中子项目的代码。 我们有时在git clone的时候漏掉 --recursive选项&#xff0c;导致编…

【办公自动化】用Python批量从上市公司年报中获取主要业务信息

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

python3 重启docker方法

一、工作中的问题 工作中进行测试时&#xff0c;需要修改nacos配置&#xff0c;修改完成后再重启对应的docker容器&#xff0c;让配置生效&#xff0c;研究了下&#xff0c;使用docker库可以做到。 如何修改nacos配置可以参见我的另一篇文章&#xff0c;传送门 python3 修改…

软件测试行业已经卷到什么程度了?

近几个月经常听到IT行业的人员吐槽找工作难的事情&#xff0c;特别是找软件测试工作相比前几年难了很多&#xff0c;以前只要简历一挂网上&#xff0c;每天会接到好多个面试邀请电话&#xff0c;甚至两三天或者一周内就能把工作找好&#xff0c;而现在把简历投了个遍&#xff0…

10. 正则表达式匹配

10. 正则表达式匹配 class IsMatch:"""10. 正则表达式匹配https://leetcode.cn/problems/regular-expression-matching/description/"""def solution(self, s: str, p: str) -> bool:m, n len(s), len(p)memo [[-1] * n for _ in range(m)]…

T-ETL和ELT区别

ETL表示提取、转换和加载&#xff1b;ELT表示提取、加载和转换。都是用于数据集成。 两者区别 ETL和ELT在数据集成过程中有着明显的区别。 ETL ETL&#xff0c;即抽取、转换、加载&#xff0c;是从不同的数据源抽取信息&#xff0c;将其转换为根据业务定义的格式&#xff0c…

在Linux上利用宝塔面板搭建网站,并通过内网穿透方便地实现公网访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…