【第二篇章】优秀的机器学习策略 超参数优化之决策树
在机器学习的浩瀚星空中,决策树作为一颗璀璨的星辰,以其直观易懂、解释性强以及高效处理分类与回归任务的能力,赢得了众多数据科学家与工程师的青睐。随着大数据时代的到来,如何从海量数据中提炼出有价值的信息,构建出既准确又可靠的预测模型,成为了机器学习领域不断探索的热点。而决策树,作为这一探索旅程中的重要工具,其背后的超参数调整与优化策略,更是直接关系到模型性能的优劣。
【第二篇章】的开启,我们聚焦于“优秀的机器学习策略”,旨在深入挖掘那些能够引领模型性能飞跃的关键要素。本篇章中,我们将目光聚焦于决策树,特别是其超参数的精妙调控,这不仅是对模型内在机制的深刻理解,更是向机器学习高峰攀登的一次重要尝试。期望读者能够深刻理解决策树背后的逻辑与智慧,掌握超参数调整的艺术,从而在机器学习的实践中更加游刃有余,创造出更加精准、高效的预测模型。
调整决策树超参树
超参数不同于参数。在机器学习中,模型被调整时,参数也被调整。例如:线性回归和逻辑回归中的权重,就是构建阶段为了最小化误差而调整的参数。相比之下,超参数是在构建阶段之前选择的,如未选择则使用默认值。
决策树回归器
毛主席说过没有调研就没有发言权,所以了解超参数的最佳途径就是实验。
尽管有关于超参数选择范围的理论,但结果往往胜过理论。不同的数据集需要不同的超参数值才能获得改进。在选择超参数之前,先通过使用DecisionTreeRegressor和cross_val_score找到一个基准评分,具体步骤如下:
import pandas as pd
df_bikes = pd.read_csv('bike_rentals_cleaned.csv') # 将数据集中的特征(X)和目标变量(y)分开。X_bikes包含除最后一列外的所有列,y_bikes包含最后一列
X_bikes = df_bikes.iloc[:,:-1]
y_bikes = df_bikes.iloc[:,-1] # 从sklearn.tree导入DecisionTreeRegressor类
from sklearn.tree import DecisionTreeRegressor # 从sklearn.model_selection导入cross_val_score函数,用于评估交叉验证的分数
from sklearn.model_selection import cross_val_score # 初始化DecisionTreeRegressor对象,设置随机种子为2以确保结果可复现
reg = DecisionTreeRegressor(random_state=2) # 使用cross_val_score函数对DecisionTreeRegressor进行交叉验证,使用均方误差作为评分指标,cv=5表示5折交叉验证
# 注意:scoring='neg_mean_squared_error'表示返回的是负均方误差,因为sklearn的某些评分函数习惯返回最小化指标
scores = cross_val_score(reg, X_bikes, y_bikes, scoring='neg_mean_squared_error', cv=5) # 由于返回的评分是负均方误差,因此取负号并开方得到RMSE(均方根误差)
rmse = np.sqrt(-scores) # 显示RMSE的平均值,保留两位小数
print('RMSE mean: %0.2f' % (rmse.mean()))
上述代码执行结果如下:
RMSE mean:1233.36
均方根误差为1233.36,这比之前线性回归得到的972.06和XGBoost得到的887.31更糟。
接下来分析模型是否因为方差太大而过拟合数据。
这个问题可以通过观察决策树在训练集上预测的表现来解决。在对测试集进行预测之前,以下代码检查训练集的误差率:
from sklearn.linear_model import LinearRegression
X_train, X_test, y_train, y_test = train_test_split(X_bikes, y_bikes, random_state=2)# 初始化DecisionTreeRegressor对象。如果不指定参数,则使用默认参数。
reg = DecisionTreeRegressor() # 使用训练集(X_train和y_train)来拟合(训练)DecisionTreeRegressor模型。
# 这意味着模型将学习如何从X_train的特征中预测y_train的值。
reg.fit(X_train, y_train) # 使用训练好的模型对训练集X_train进行预测,得到预测值y_pred。
# 这一步通常用于评估模型在训练数据上的表现,但需要注意的是,过高的训练精度可能表明过拟合。
y_pred = reg.predict(X_train) # 从sklearn.metrics导入mean_squared_error函数,用于计算预测值和实际值之间的均方误差(MSE)。
from sklearn.metrics import mean_squared_error # 计算训练集上预测值y_pred和实际值y_train之间的均方误差(MSE)。
# MSE是衡量模型预测精度的一种常用指标,值越小表示模型预测越准确。
reg_mse = mean_squared_error(y_train, y_pred) # 计算均方根误差(RMSE),它是MSE的平方根。
# RMSE提供了与原始数据相同单位的误差度量,便于理解模型性能。
# 类似于MSE,RMSE的值越小表示模型预测越准确。
reg_rmse = np.sqrt(reg_mse) # 包含了模型在训练集上的RMSE值,是衡量模型预测性能的一个重要指标。
reg_rmse
结果为:0.0
RMSE为0.0意味着该模型完美地拟合了每个数据点!
结合1233.36的交叉验证误差,这个完美的评分表明决策树对数据进行了高方差的过拟合。训练集拟合完美,但测试集表现不佳。我们有了调查研究,下面引入本篇的主题“超参数”。
一般超参数
max_depth
定义:
max_depth 指的是决策树的最大深度,即树中从根节点到最远叶子节点的最长路径上的节点数。通过限制树的最大深度,我们可以控制模型的复杂度,从而避免过拟合(overfitting)现象。
使用方法:
- 在使用决策树模型时,可以通过设置max_depth参数来限制树的最大深度。这个参数通常是一个整数,表示从根节点到最远叶子节点的最长路径上的节点数。
- 如果不设置max_depth(在某些实现中可能是默认值None),则决策树将一直生长,直到满足其他停止条件(如所有叶子节点都是纯的,或者叶子节点包含的样本数少于某个阈值)。
优点:
- 设置max_depth可以有效地防止决策树模型过拟合。过拟合是指模型在训练数据上表现过于复杂,以至于无法很好地泛化到新数据上。通过限制树的最大深度,可以减少模型对训练数据中噪声和异常值的敏感度,从而提高模型的泛化能力。
- 较浅的决策树更容易被人类理解。每个节点都代表了一个简单的决策规则,这使得模型的决策过程更加透明和可解释。这对于需要高度可解释性的应用场景(如医疗诊断、金融风险评估等)尤为重要。
- 较深的决策树需要更多的计算资源来训练和预测。通过减小max_depth,可以减少模型的复杂度和计算量,从而降低训练和预测的时间成本。这对于处理大规模数据集或实时预测任务尤为重要。
- max_depth是一个灵活的参数,可以根据具体问题和数据集的大小和复杂度进行调整。通过尝试不同的max_depth值,可以找到最适合当前问题的模型配置。
GridSearchCV
定义:
GridSearchCV是一种超参数优化技术,用于搜索机器学习模型的超参数值的最佳组合。它是Python中scikit-learn库的一部分,通过交叉验证来评估不同超参数组合下的模型性能,从而找到最优的超参数设置。
使用方法:
- 定义一个参数网格(param_grid),其中包含要搜索的超参数名称和对应的值列表。
- 创建一个GridSearchCV对象,将模型、参数网格、交叉验证的折数(cv)以及并行工作的数量(n_jobs)作为参数传递给GridSearchCV。
- 使用训练数据拟合GridSearchCV对象,它会自动搜索并评估所有超参数组合,找到使模型性能最佳的超参数设置。
- 使用最佳超参数设置下的模型进行预测。
优点:
- 自动化程度高,能够系统地搜索超参数空间。
- 通过交叉验证评估模型性能,结果更加可靠。
继续试验:
# 导入GridSearchCV,这是用于自动调参的工具,可以在指定的参数范围内,通过交叉验证来找到最优的模型参数
from sklearn.model_selection import GridSearchCV # 选择max_depth作为要优化的超参数,并定义一个字典params,其中包含max_depth可能取的值。None表示不限制深度,其他是具体的深度值
params = {'max_depth':[None,2,3,4,6,8,10,20]} # 初始化回归模型DecisionTreeRegressor,设置random_state为2以确保结果的可重复性。random_state用于控制随机数生成,有助于复现结果
reg = DecisionTreeRegressor(random_state=2) # 初始化GridSearchCV对象grid_reg,传入回归模型reg、要优化的参数params、评分指标scoring(这里使用'neg_mean_squared_error'即负均方误差,因为GridSearchCV默认寻找最大化评分的参数组合,而均方误差越小越好,所以使用其负值)、交叉验证的折数cv为5(即将数据集分成5份进行交叉验证)、以及n_jobs=-1表示使用所有可用的CPU核心进行并行计算
grid_reg = GridSearchCV(reg, params, scoring='neg_mean_squared_error', cv=5, n_jobs=-1) # 使用GridSearchCV对象grid_reg拟合训练数据X_train和y_train。这一步会进行交叉验证,并尝试所有指定的max_depth值,找到最优的参数组合
grid_reg.fit(X_train, y_train) # 从grid_reg中提取最佳参数组合
best_params = grid_reg.best_params_ # 打印最佳的超参数组合
print("Best params:", best_params)
上述代码输出结果如下:Best params(最佳参数): {‘max_depth’: 6}
由上面结果可知,在训练集中,max_depth值为6是最佳的交叉验证评分。
继续往下看训练得分:
# 由于GridSearchCV使用'neg_mean_squared_error'作为评分指标,这里需要先取负值(因为GridSearchCV默认寻找最大化评分的参数组合),
# 然后对结果开方,因为均方误差(MSE)的平方根是均方根误差(RMSE),这是回归任务中常用的一个性能指标。
# grid_reg.best_score_存储了最佳参数组合下的评分(即负均方误差),所以我们需要先取反再开方得到RMSE。
best_score = np.sqrt(-grid_reg.best_score_) # 打印出使用最佳参数组合在训练集上得到的评分(这里实际上是均方根误差RMSE),保留三位小数。
# 注意:“Training score”,实际上这个评分是在交叉验证过程中得到的,是对模型泛化能力的一个估计,
# 而不仅仅是训练集上的性能。
print("Training score: {:.3f}".format(best_score))
训练评分为:951.938
测试评分:
# 从GridSearchCV对象中提取最佳模型。GridSearchCV在搜索过程中找到了最佳参数组合,并训练了相应的模型。
# best_estimator_属性包含了这个最佳模型的实例。
best_model = grid_reg.best_estimator_ # 使用最佳模型对测试集X_test进行预测,得到预测结果y_pred。
# 这些预测结果是模型根据测试集特征所做出的目标值估计。
y_pred = best_model.predict(X_test) # 从sklearn.metrics模块导入mean_squared_error函数,该函数用于计算均方误差(MSE)。
# 导入计算MSE的函数,并且稍后会用它来计算RMSE(均方根误差)。
from sklearn.metrics import mean_squared_error # 计算测试集上的均方根误差(RMSE)。首先,使用mean_squared_error函数计算测试集真实值y_test和预测值y_pred之间的均方误差(MSE)。
# 然后,通过取MSE的平方根得到RMSE,RMSE是回归任务中常用的一个性能指标,它衡量了预测值与实际值之间的差异大小。
rmse_test = mean_squared_error(y_test, y_pred)**0.5 # 打印出测试集上的RMSE值,保留三位小数。这个值反映了模型在完全独立的测试集上的性能表现。
print('Test score: {:.3f}'.format(rmse_test))
测试评分为:864.670,方差较之前有所减少。
min_samples_leaf
定义:
min_samples_leaf是决策树算法中的另一个重要超参数,它限定了一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生。这个参数有助于防止模型过拟合,提高模型的泛化能力。
影响:
- 当min_samples_leaf设置得较小时,决策树将更容易生成分支,模型可能更加复杂,容易过拟合。
- 当min_samples_leaf设置得较大时,决策树将更难生成分支,模型将变得更加简单,但可能欠拟合。
选择策略:
- 通常需要根据数据集的大小和特征来选择合适的min_samples_leaf值。对于较小的数据集,可以选择较小的值;对于较大的数据集,可以选择较大的值。
- 可以通过实验和交叉验证来找到最佳的min_samples_leaf值,使得模型在测试集上的表现最佳。
测试min_samples_leaf的一系列值需要进行与之前相同的过程。下面我们定义一个函数方面后续调用:
# 定义一个名为grid_search的函数,该函数接受两个参数:params(一个字典,包含要优化的超参数及其候选值)和reg(一个回归树模型实例,默认为DecisionTreeRegressor,随机状态设置为2以确保结果可复现)。
def grid_search(params, reg=DecisionTreeRegressor(random_state=2)): # 实例化GridSearchCV对象grid_reg,传入回归模型reg、要优化的参数params、评分指标scoring(这里使用'neg_mean_squared_error'即负均方误差,因为GridSearchCV默认寻找最大化评分的参数组合,而均方误差越小越好,所以使用其负值)、交叉验证的折数cv为5、以及n_jobs=-1表示使用所有可用的CPU核心进行并行计算。 grid_reg = GridSearchCV(reg, params, scoring='neg_mean_squared_error', cv=5, n_jobs=-1) # 使用GridSearchCV对象grid_reg拟合训练数据X_train和y_train。这一步会进行交叉验证,并尝试所有指定的参数组合,找到最优的参数组合。 grid_reg.fit(X_train, y_train) # 从grid_reg中提取最佳参数组合。 best_params = grid_reg.best_params_ # 打印出最佳的超参数组合。 print("Best params:", best_params) # 计算最佳参数组合下的评分(实际上是负均方误差的负值,需要取反并开方得到均方根误差RMSE,这里直接计算了RMSE作为训练集上的性能评估)。 best_score = np.sqrt(-grid_reg.best_score_) # 打印出训练集上的最佳性能评分(均方根误差RMSE),保留三位小数。 print("Training score: {:.3f}".format(best_score)) # 使用最佳模型(即grid_reg内部训练好的最佳参数组合对应的模型)对测试集X_test进行预测,得到预测结果y_pred。 y_pred = grid_reg.predict(X_test) # 计算测试集上的均方根误差(RMSE),即测试集真实值y_test和预测值y_pred之间的均方误差的平方根。 rmse_test = mean_squared_error(y_test, y_pred)**0.5 # 打印出测试集上的RMSE值,保留三位小数。这个值反映了模型在完全独立的测试集上的性能表现。 print('Test score: {:.3f}'.format(rmse_test))
需要注意的地方:
选择超参数范围时,了解构建模型的训练集大小是很必要的,也就是行列数。
本次训练集548行,调用之前定义好的函数传入参数:
grid_search(params={'min_samples_leaf':[1,2,4,6,8,10,20,30]})
运行代码结果为:
Best params: {‘min_samples_leaf’: 8}
Training score: 896.083
Test score: 855.620
测试评分优于训练评分,说明方差已经减小。
同时设置min_samples_leaf和max_depth,代码如下:
grid_search(params={'max_depth':[None,2,3,4,6,8,10,20],'min_samples_leaf':[1,2,4,6,8,10,20,30]})
Best params: {‘max_depth’: 6, ‘min_samples_leaf’: 2}
Training score: 870.396
Test score: 913.000
结果出人意料,尽管训练评分已经提高,但测试评分没有改善。
继续调整传入参数将min_samples_leaf限制为大于3的值:
grid_search(params={'max_depth':[5,6,7,8,9],'min_samples_leaf':[3,5,7,9]})
Best params: {‘max_depth’: 9, ‘min_samples_leaf’: 7}
Training score: 888.905
Test score: 878.538
结果显示测试评分已经提高(越低越好),接下来将探讨决策树剩余的超参数,但不进行测试,一个好的模型太费时间了。
max_leaf_nodes
用途:限制决策树的最大叶子节点数。当树达到最大叶子节点数时,停止生长。
用法:通过设置一个整数来指定最大叶子节点数。max_leaf_nodes=10表示模型不能超过10个叶节点。
效果:较小的值会导致较简单的树,有助于防止过拟合,但可能会增加欠拟合的风险。
max_features
用途:在寻找最佳分割时要考虑的特征数量。这个参数在随机森林等集成方法中特别有用,但在单个决策树中也可以用来减少计算量或引入随机性。
用法:可以是整数、浮点数或字符串。整数表示要考虑的特征的绝对数量;浮点数表示要考虑的特征比例(例如,0.5 表示考虑一半的特征);字符串 “auto” “sqrt” "log2"表示自动选择特征数量(“auto” 表示所有特征(默认值),“sqrt” 表示 sqrt(n_features),"log2"以2为底的特征总数的对数)。
效果:减少考虑的特征数量可以加速训练过程,降低方差,并可能通过引入随机性来减少过拟合。
min_samples_split
用途:分割内部节点所需的最小样本数(默认值为2,因为两个样本可能会被分割,各自成为单个叶节点)如果限制增加到5,则意味着对于具有5个或更少样本的节点,不允许进一步分割。
用法:设置一个整数。
效果:增加这个值会导致树生长得更慢,因为节点需要更多的样本来分裂。这有助于减少过拟合,但也可能导致欠拟合。
splitter
用途:用于在每个节点选择最佳分割的策略,将splitter更改为"random"是防止过拟合和使树多样化的好方法。
用法:可以是 “best” 或 “random”。“best” 表示选择最佳分割(基于给定的标准),而 “random” 表示随机选择分割。
效果:“random” 可以增加模型的随机性,有助于减少过拟合,但可能会牺牲一些性能。
criterion
用途:用于评估分割质量的函数。
用法:对于分类问题,通常是 “gini” 或 “entropy”;对于回归问题,通常是 “mse”(均方误差)或 “friedman_mse”(弗里德曼均方误差)。
效果:不同的标准可能会导致不同的树结构和性能。
min_impurity_decrease
用途:如果节点的分割导致杂质(impurity)大于或等于这个值(默认值为0),则节点将被分割。杂质是衡量每个节点预测纯度的指标。准确度为100%的树的杂质值为0。准确度为80%的树的杂质值为0.20。
用法:设置一个浮点数。
效果:这个参数用于控制树的生长,较小的值允许树有更多的分支,而较大的值则限制树的生长。
min_weight_fraction_leaf
用途:一个叶子节点必须具有的总权重的最小比例(用于加权样本)。可以减少方差并防止过拟合。默认值为0.假设权重相等,限制为1%,表明500个样本中至少有5个应成为叶节点。
用法:设置一个浮点数,范围在 0 和 0.5 之间。
效果:这个参数在处理加权样本时特别有用,它允许用户指定叶子节点必须包含的最小样本权重比例。
ccp_alpha
用途:成本复杂度剪枝的阈值。
用法:设置一个非负浮点数。较大的值会导致更简单的树。
效果:ccp_alpha 是一种新的剪枝策略,称为成本复杂度剪枝(Cost-Complexity Pruning)。它通过比较树的不同子树的成本(包括错误率和复杂度)来选择最佳的剪枝点。
Tips:
理解数据:
在开始调整超参数之前,先彻底理解你的数据集。了解数据的特征、目标变量的分布、以及任何调整潜在的所有异常超值参数或。缺失相反值,。应该逐个
逐步调整:
不要一次性或成对地调整超参数,并观察它们对模型性能的影响。
使用交叉验证:
交叉验证是评估模型性能的重要工具。它可以帮助你了解模型在不同数据集上的表现,并减少过拟合的风险。在调整超参数时,应该使用交叉验证来评估每个设置的效果。
默认设置作为起点:
大多数决策树实现都提供了合理的默认超参数设置。这些设置通常是基于广泛研究的,并适用于许多常见情况。因此,建议从默认设置开始,并根据需要进行调整。
考虑问题的性质:
决策树模型超参数的选择应该与你要解决的问题的性质相匹配。例如,在分类问题中,你可能更关心模型的分类准确率,而在回归问题中,你可能更关心模型的预测误差。
平衡过拟合和欠拟合:
过拟合和欠拟合是决策树模型中常见的问题。通过调整超参数(如max_depth、min_samples_split等),你可以控制树的复杂度,并在过拟合和欠拟合之间找到平衡。
使用网格搜索和随机搜索:
网格搜索(GridSearchCV)和随机搜索(RandomizedSearchCV)是两种流行的超参数优化技术。它们可以自动地搜索超参数空间,并找到最优的超参数组合。这些技术可以节省大量时间,并帮助你找到更好的模型配置。
监控训练时间:
决策树的训练时间可以随着超参数的变化而变化。例如,增加max_depth或max_leaf_nodes可能会导致训练时间显著增加。因此,在调整超参数时,请务必监控训练时间,并确保它在可接受的范围内。
考虑集成方法:
如果你发现单个决策树模型的性能不够理想,可以考虑使用集成方法(如随机森林、梯度提升树等)。这些方法通常通过组合多个决策树来提高模型的准确性和稳定性。
持续学习:
机器学习是一个不断发展的领域。随着新算法和技术的出现,你可能需要不断地学习新的知识和技能来优化你的决策树模型。因此,请保持对最新研究的关注,并持续学习新的技术和方法。
实际上,决策树的超参数太多,根本无法全部用到,本文仅将常用的奉上,现在已经学习了决策树和决策树超参数的基础知识,是时候部署一个小项目了,欲知后文如何,请看下篇分解。
相关文章:
【第二篇章】优秀的机器学习策略 超参数优化之决策树
在机器学习的浩瀚星空中,决策树作为一颗璀璨的星辰,以其直观易懂、解释性强以及高效处理分类与回归任务的能力,赢得了众多数据科学家与工程师的青睐。随着大数据时代的到来,如何从海量数据中提炼出有价值的信息,构建出…...
httprunner转载
基于 HttpRunner4.0 的接口自动化测试实践 测试之家 from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase # 配置数据库连接信息 config ( Config("database test") .variables( **{ "db_host": &…...
反序列化漏洞vulhub靶场serial
环境搭建 下载 https://download.vulnhub.com/serial/serial.zip 解压出来就是这种 你会得到一个这样的文件,这里使用VMware新建一个虚拟机,这里记录比较重要的几部分。 这里就是使用我们刚才下过来的。 漏洞过程详解 1.信息收集 打开靶机࿰…...
C++ 文件流详解
在 C 中,文件处理是一个常见且重要的任务。标准库提供了三种主要的文件流类来处理文件输入和输出:fstream、ifstream 和 ofstream。这些类都在 <fstream> 头文件中定义。 一、fstream 类 fstream 是文件流类的基类,既可以用于读操作&…...
docker compse简介与安装
目录 1. Docker Compose 简介 2. Docker Compose 安装 2.1 在 Ubuntu 上安装 Docker Compose 2.1.1 通过 apt 安装 2.1.2 使用官方脚本安装最新版本 2.2 在 CentOS 上安装 Docker Compose 2.2.2 使用官方脚本安装最新版本 2.2.3 使用 pip 安装 2.3 在 openEuler 上安装…...
基于深度学习的零样本学习
零样本学习(Zero-Shot Learning, ZSL)是深度学习中的一个前沿研究领域,其目标是在没有见过目标类别的样本的情况下,对这些新类别进行识别或分类。这种方法特别适用于在实际应用中存在大量未标注类别或新类别不断涌现的场景&#x…...
C++——list容器以及手动实现
LIST容器 list概述列表容器属性例子 list函数构造函数默认构造函数:带有元素个数和元素初值的构造函数:范围构造函数:拷贝构造函数:移动构造函数:示例 赋值运算符重载拷贝赋值操作符 (1):移动赋值操作符 (2…...
Win11系统文件资源管理器鼠标右键卡顿解决方法
引用链接: Windows 11文件资源管理器崩溃怎么解决?看看这7个解决办法!...
零基础学Python之 第十八讲 文件读写
当你开始学习Python编程时,文件读写是一个非常基础且重要的技能。本篇博客将引导你从零开始学习如何在Python中进行文件读写操作。 1. 打开文件 在Python中,要操作一个文件,首先需要打开它。使用内置的 open() 函数来打开文件,语…...
检索增强生成(RAG):智能内容生成的新纪元
引言 在大 AI 时代,生成式人工智能(GenAI)模型,尤其是大型语言模型(LLM),已经展现出了令人瞩目的能力。然而,这些模型在提供信息的准确、即时、专业、权威等方面仍存在局限。检索增…...
ubuntu2204安装elasticsearch7.17.22
下载安装 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.22-amd64.deb wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.22-amd64.deb.sha512 shasum -a 512 -c elasticsearch-7.17.22-amd64.deb.sha512 su…...
介绍Servlet后端中两种接收参数方式req.getAttributer和req.getParameter的区别
数据来源 getParameter:此方法用于获取客户端发送的请求中携带的参数,通常这些参数是通过HTTP GET或POST请求传递的表单数据。例如,用户填写的用户名和密码等输入信息。getAttribute:该方法用来获取在服务器端通过setAttribute方法…...
Delphi FMX安卓Android播放mp3音频内存流
【笔记:安卓开发JavaDelphi FMX】 Delphi FMX跨平台的MediaPlayer无法播放音频数据流只能打开音频文件播放,但有时候需要直接播放内存流数据而无需生成文件,可以通过把内存流转ByteArray再通过Android平台系统原生的MediaDataSource或ParcelF…...
MapUtils常用方法
1、摘要 MapUtils是一个用于处理Map对象的实用工具类,它提供了许多方便的方法来执行常见的操作,如获取值、设置默认值、合并Map等。本文将介绍MapUtils的常见用法,以帮助你更轻松地处理Map数据。 2、前言 在Java编程中,Map是一…...
自定义PasswordEditText控件,在手机字体应用后,字体样式未发生改变
原来的输入类型inputType为textPassword,现在将 inputType删掉即可...
学习打卡第31天
...
opencascade AIS_TexturedShape源码学习 贴纹理
opencascade AIS_TexturedShape opencascade 贴纹理 前言 //! 该类允许在形状上映射纹理。 //! 显示模式 AIS_WireFrame (0) 和 AIS_Shaded (1) 的行为与 AIS_Shape 中的行为相同, //! 而新模式 2 (包围盒) 和 3 (纹理映射) 扩展了其功能。 //! //! 纹理本身在 (0…...
C# winform 串口读取字节流,MB级别字节流
一、串口读取字节流 在 C# 中使用 Windows Forms (WinForms) 应用程序进行串口通信时,通常会使用 System.IO.Ports 命名空间中的 SerialPort 类。以下是一个简单的示例,展示了如何设置一个串口并读取字节流。 步骤 1: 添加引用 确保你的项目中已经包含…...
创建一个简单的单链表
1.头文件的Slist.h的代码 #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> typedef int SListint; typedef struct Slist//单链表 {SListint data;struct Slist* next; }SL;//尾插 void SlistPushBank(SL*…...
15.1 Zookeeper简介安装及基础使用
1. Zookeeper介绍 1.1 介绍 1.2 应用场景简介 1.3 zookeeper工作原理 1.4 zookeeper特点...
详细说明Java中Map和Set接口的使用方法
Map与Set的基本概念与场景 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有: 1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢。 2. 二分查找&#x…...
CSS3 scale 适配
Scale适配,在前端开发中,特别是在CSS3中,主要指的是使用scale()函数对元素进行缩放处理,以适应不同的屏幕尺寸或达到特定的视觉效果。以下是对Scale适配的详细介绍: 一、基本概念 scale() 是CSS3中transform属性的一…...
SX_初识GitLab_1
1、对GitLab的理解: 目前对GitLab的理解是其本质是一个远程代码托管平台,上面托管多个项目,每个项目都有一个master主分支和若干其他分支,远程代码能下载到本机,本机代码也能上传到远程平台 1.分支的作用:…...
这才是 PHP 高性能框架 Workerman 的立命之本
大家好,我是码农先森。 在这个大家都崇尚高性能的时代,程序员的谈笑间句句都离不开高性能,仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low,其中众所皆知的 Nginx 就是高性能的代表。有些朋友可能连什么是高性能都不一定理解…...
Python——记录pip问题(解决下载慢、升级失败问题)
在python开发中,经常需要使用到各种各样的库。 pip又是我们常用的安装工具。但是国外的源下载速度实在太慢,经常导致超时。 有很多朋友刚刚学Python的时候,会来问为什么pip下载东西这么慢啊? 而且pycharm里面下载库也是非常的慢…...
Windows Server 2025 Preview 部署 Ⅰ—— ISO下载和硬件要求
目录 1. 预览版下载2. Windows 服务器的硬件要求2.1安装 Windows Server 2025 虚拟机注意事项2.2 CPU2.3 RAM / Memory2.4 存储 Storage2.5 网络 Network2.6 其他需求 1. 预览版下载 下载网站:https://www.microsoft.com/en-in/evalcenter/download-windows-server…...
AI2-CUDA、CuDNN、TensorRT的详细安装教程
一、查看本机的显卡 首先你要看你的电脑是否有NVIDIA的独立显卡,你可以在设备管理器-显示适配器中查看 点击“开始”--找到“NVIDA Control Panel” 点击帮助--系统信息--组件,查看NVCUDA.DLL对应的产品名称,就可以看住CUDA的版本号 这里的版…...
TCP连接中重复使用了两个相同的端口怎么办
1.检查并避免重复配置: 首先,应该检查系统的配置和应用程序的设置,确保没有错误地将多个服务或进程配置为使用相同的端口号。 使用网络监控工具(如netstat、ss等)来查看当前哪些端口正在被使用。 2.使用端口复用选项…...
如何自定义异常
目录 为什么自定义异常自定义异常的步骤参考资料 为什么自定义异常 自定义异常是指开发者根据应用程序的需求和逻辑,自行定义的异常类。与 Java 提供的标准异常类(如 NullPointerException、IOException 等)不同,自定义异常允许程…...
C++中的依赖注入
目录 1.概述 2.构造函数注入 3.setter方法注入 4.接口注入 5.依赖注入框架 6.依赖注入容器 7.依赖注入框架的工作原理 8.依赖注入的优势 9.总结 1.概述 依赖注入是一种设计模式,它允许我们在不直接创建对象的情况下为对象提供其依赖项;它通过将…...
专门做尿不湿的网站/常德网站建设公司
Web开发做得多了,总觉得是体力活,于是搞些代码让自己脱离无聊的Coding吧(是脱离“无聊的”Coding,不是脱离无聊的“Coding”)。初级阶段 为每个QueryString写转换的代码,针对不同的类型,进行转换…...
云服务器做网站视屏/关键词seo优化排名
maven官网,不同后缀文件的区别下载官网:https://maven.apache.org/download.cgi 首先弄清楚各后缀的含义: bin代表二进制class文件(由java文件编译而成)src代表源码(java源码),源码source比binary大一些&…...
广州响应网站建设/在线网页制作系统搭建
首先说一下, href属性 和 onclick事件 的执行顺序,当鼠标点击a标签的时候会先执行 onclick事件, 然后才是 href 属性下的动作(页面跳转,或 javascript 伪链接),如果不想执行href 属性下的动作执行,onclick …...
网站建栏目建那些/微博热搜榜排名今日
查表法import java.util.Scanner;public class Main{/** 使用查表法*//*查表法的应用:* 有规律的,就可以使用查表法* */public static void main(String[] args){Scanner cin new Scanner(System.in);{int x cin.nextInt();/** 查询星期* */System.out…...
培训公司网站建设/企业网站优化软件
Kettle8.2与HBase集成一、HBase安装1.1 zookeeper单机安装1.2 HBase安装1.3 创建weblogs表,列族为pageviews二、Kettle配置三、案例演示3.1 功能描述3.2 测试数据3.3 组件实现3.4 运行验证说明:环境:Centos7 Kettle8.2 hbase-1.3.1 zookee…...
wordpress更改地址后404.3/重庆百度开户
1.成瘾行为的特征有()。 A.心理性依赖 B.社会性依赖 C.生理性依赖 D.一旦恢复成瘾行为阶段症状消失 E.终止使用成瘾物质会引起戒断症状 2.健康风险评估的作用包括 A.健康干预措施的制订 B.健康危险因素的认识 C.健康保险费用的预测 D.健康管理人群的分…...