机器学习特征构建与特征筛选

news2024/11/15 17:15:06

前言

上一篇文章讲述了原始特征分析和处理,保障后续拿到的是干净的特征变量,但实际这些特征对于建模不一定是有效的,所以需要在原始特征的基础上,结合业务场景做特征变量的衍生,提升数据的表达能力。此外,因为特征值的维度、分布、量纲等,真正进入模型训练还需要对特征做对应的变换处理。

特征构建

统计特征构建

参照pandas提供的titanic救生数据,筛选里面有特征变量

survivedpclasssexagesibspparchfareembarkedclasswhoadult_malealone
存活票等级性别年龄同行子女/配偶同行父母票价登船港口社会阶层乘客类型是否成年是否独自

其中,年龄对应的人群获救概率不同,所以可以对年龄做衍生。按照年龄,将其分为child/yong/middle/old4个等级。

def age_bin(x):
    if x<=18:
        return 'child'
    elif x <=30:
        return 'yong'
    elif x<=45:
        return 'mid'
    else:
        return 'old'

#     增加age_bin特征
dt['age_bin'] = dt['age'].map(age_bin)

# 按照家庭维度,可以衍生家庭规模大小特征

dt['family_size'] = dt['sibsp'] +dt['parch'] + 1
print(dt['family_size'].head())

周期值构建

数据有时间维度的,可以结合业务抽取出新特征。比如,用户的电商消费数据,每个时间点是一行记录,可以抽取出仅一周消费频次、近一月消费频次等;

数据分桶

数据分桶通常是对连续性特征的处理方式,常见的分桶有

  • 等频分箱:数据平均分成几份
  • 等距分箱:数据按照最小值和最大值间距等分
  • 自定义分箱:结合业务场景自定义分箱规则
  • 卡方/Best-KS分桶: 这种方法侧重于发现目标分类变量和连续变量之间的关系,适用于分类问题中的特征工程。
  • 最小熵法分桶:最小熵法的目标是找到一种分箱方式,使得每个桶内的数据分布熵之和最小.适用于追求数据纯净度的场景.

对船票数据分析:

看到数据有很强的长尾效应,如果采用等距切分,容易出现分桶数据不均匀,所以采用等频切分。

# 设定分桶数量,拿到分桶值

data_cut, bins = pd.qcut(dt['fare'], 10, retbins=True)

# 查看桶内样本数量

data_cut.value_count()

# 定义函数,做分桶变量替换

def fare_cut(x):
    if x <= 7.854:
        return 0
    elif x<= 10.5:
        return 1
    elif x <= 21.679:
        return 2
    elif x<= 39.688:
        return 3
    else:
        return 4;
dt['fare_bin'] = dt['fare'].map(fare_cut)

特征组合

常用的特征组合有:

  • 离线+离散:构建笛卡尔积
  • 离线+连续:连续特征分桶后基于类别特征group by构建统计特征
  • 连续+连续:加减乘除,多项式特征,二阶差分等。
  • 多项式特征:针对连续值特征,对几个特征构建多项式特征,以达到特征组合与高阶增强的作用。于一些需要非线性关系建模的问题非常有用。

poly = PolynomialFeatures(degree=2)  # 指定二次多项式
X_poly = poly.fit_transform(X)
print("Transformed features:\n", X_poly)

特征变换

连续特征变换

标准化处理

标准化处理是指将特征数值转换成算数平均为0,方差(以及标准差)为1的分布。

from sklearn.preprocessing import StandardScaler
X = np.array([[1], [2], [3], [4], [5]])
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

归一化处理(尺度缩放)

归一化处理是基于向量模长调整数据幅度大小,但并不会改变原始数据的顺序。

L2范数归一化:{x}' = \frac{x}{\sqrt{x_{1}^{2} + x_{2}^{2} + ...x_{n}^{2}}}

L1范数归一化:x=\frac{x-x_{min}}{x_{max}-x_{min}}

scaler = MinMaxScaler()

data_normalized = scaler.fit_transform(data)

归一化和标准化的区别联系

  • 归一化是为了消除纲量压缩到[0,1]区间;标准化只是调整特征整体的分布,无大小限制。
  • 归一化与最大,最小值有关;标准化与均值,标准差有关。

适用性选择

  • 在分类、聚类算法中,需要使用距离来度量相似性的时候,如SVN、KNN、PCA等,标准化表现良好
  • 在不涉及到距离、协方差计算、数据不符合正态分布情况下,使用归一化处理,比如图像的RGB色
  • 基于树模型(随机森林、GBDT、XGBoost、 LightGBM)等,不需要进行特征的归一化处理;
  • 基于参数的模型或者距离的模型,如LR、K-Means、NN等,需要对参数进行归一化处理;

非线性变换

有些场景下,会对数值字段进行分布调整或者校正,利用统计或数学变换来减轻数据分布倾斜的影响。使原本密集的区间的值尽可能的分散,原本分散的区间的值尽量的聚合。

log变换:主要作用为稳定方差,主要针对连续特征的重尾分布调整

box-cox: 主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式,box-cox 变换可以明显地改善数据的正态性、对称性和方差相等性. 引入参数的最佳取值通常由最大似然或最大对数似然确定。

离散变量处理

对于类别型的字段特征(比如颜色、类型、好坏程度),有很多模型并不能直接处理,我们对其进行编码后能更好地呈现信息和支撑模型学习

标签编码

标签编码值介于0和 n_classes-1 之间的标签。 优点是占用更少的空间,并且支持文本编码。缺点是引入了标签的大小关系。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
da = le.fit_transform(["超一线", "一线", "二线", "三线"])

one-hot编码

通常用于处理类别间不具有大小关系的特征。

from sklearn.preprocessing import OneHotEncoder
# 非负整数表示的标签列表
labels = [0,1,0,2]
# 行向量转列向量
labels = np.array(labels).reshape(len(labels), -1)
enc = OneHotEncoder()
print(enc.fit_transform(labels).toarray())

标签二值化

功能与 OneHotEncoder 一样,但是 OneHotEncoder 只能对数值型变量二值化,无法直接对字符串型的类别变量编码,而 LabelBinarizer 可以直接对字符型变量二值化 。

from sklearn.preprocessing import LabelBinarizer
lb=LabelBinarizer()
labelList=['yes', 'no', 'no', 'yes','no2']
# 将标签矩阵二值化
dummY=lb.fit_transform(labelList)
print("dummY:",dummY)

降维

降维的目的是减少特征属性个数,确保特征变量间相互独立。原因是特征数据可能存在以下几个问题:

  • 数据多重共线性:特征与特征之间存在相互关联,多重共线性会导致解空间不稳定,模型鲁棒性差;
  • 高维空间样本稀疏性:样本稀疏导致难以分析出特征特性
  • 过多变量会妨碍最优解的查找和找解效率;

PCA降维

import numpy as np
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
newX = pca.fit_transform(X)
draw_result(newX, y)

SVD 降维

与PCA降维类似,不过PCA求的是协方差矩阵,SVD求解的是A(T)A的特征值分解。

T-SNE

T-SNE(t-distributed stochastic neighbor embedding)是一种非线性降维方法,参考的代码实现如下:

from sklearn.manifold import TSNE
tsne = TSNE(n_components=2)
iris_2d = tsne.fit_transform(X)
draw_result(iris_2d, y)

PCA与T-SNE选择

PCA优点:

  • 线性降维:PCA通过线性变换将原始数据映射到低维空间,保留数据的最大方差方向,从而捕获数据的主要变化趋势
  • 计算效率高:对于大规模数据集,PCA相对计算成本较低,且易于理解和实现。
  • 无监督:不需要标签信息,适用于探索性数据分析和预处理。
  • 解释性强:主成分具有实际意义,可以解释为数据变化的主要方向。

缺点:

  • 对噪声敏感:PCA假设数据是线性可分的,对异常值和噪声较为敏感。
  • 不能很好地处理非线性关系:如果数据中存在复杂的非线性结构,PCA可能无法有效捕捉。

t-SNE优点:

  • 非线性降维:t-SNE擅长捕捉高维数据中的复杂非线性结构,能够展示数据的局部结构和簇信息。
  • 可视化效果好:特别适合用于二维或三维可视化,能够清晰地展示不同类别的数据点分布,有助于模式识别和探索性分析。
  • 保持局部相似性:通过模拟高维空间中样本间的邻近关系,在低维空间中保持样本的局部结构。

缺点:

  • 计算成本高:计算复杂度较高,尤其是对于大数据集,可能需要较长时间。
  • 参数敏感:对超参数(如 perplexity)非常敏感,选择不当可能得到较差的结果。
  • 解释性弱:降维结果难以直接解释,更多用于可视化而非直接建模输入。

如果目标是简化数据以便于后续的线性模型使用,或者需要一种快速且可解释的降维方法PCA可能是更好的选择。如果数据中包含复杂的非线性关系,且主要目的是进行数据探索或可视化以发现潜在的结构和模式,那么t-SNE会更加合适。

特征选择

原始特征经过分析处理、构建和转换后,还需要进行筛选。冗余的特征容易导致资源消耗高、噪声大,并且还可能产生过拟合。特征选取的方向有:

  • 特征发散度:如果特征不发散,方差接近1,没什么意义;
  • 与目标相关性:相关性越大的越硬蛋保留;

特征选取方法进行归类,有3大类。

Filter过滤法

方差过滤法(连续特征)

通过特征本身的方差来过滤。

from sklearn.feature_selection import VarianceThreshold
var = VarianceThreshold(0.1)   # 选择方差大于0.1的特征
df = var.fit_transform(X)
print(var.get_support()==0)

相关系数法(连续特征)

 相关系数的绝对值约接近于1,表示两个变量相关性越强。通常是分析特征与目标之间的相关性,但考虑多重共线性:在筛选特征时还需注意多重共线性问题,即多个特征之间高度相关。如果发现某些特征之间存在高相关,可能需要进一步分析,选择最具解释力或最符合业务逻辑的一个特征来代表。

  • 皮尔逊相关系数:适用于两个变量都是线性且近似正态分布的情况,其值范围从-1到1,接近1表示强正相关,接近-1表示强负相关,接近0表示无明显线性关系。
  • 斯皮尔曼和肯德尔相关系数:适用于变量间可能不是线性关系或数据分布非正态的情况,更关注于变量间的单调关系。
raw_corr = raw.corr()
# 直接查看目标和特征变量的相关性
print(raw_corr['survived'].sort_values(ascending=False))
sns.heatmap(raw.corr()) # 画出热力图
# plt.show()

卡方过滤法(离散变量)

专用于分类算法,捕捉相关性,追求p小于显著性水平的特征。卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。 

F校验法(离散变量)

F检验捕捉线性相关性,要求数据服从正态分布,追求p值小于显著性水平特征。

互信息法(连续/离散变量)

是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法

from sklearn.feature_selection import mutual_info_classif as MIC
mi_scores = MIC(raw_dis,y) #得到互信息量的估计
mi_series = pd.Series(mi_scores, index=raw_dis.columns)
non_zero_mi_features = mi_series[mi_series > 0.03]
raw_dis = raw_dis[non_zero_mi_features.index]

Wrapper选择法

递归特征删除法

递归消除删除法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数 estimator 为基模型
#参数 n_features_to_select 为选择的特征个数
X_ref = RFE(estimator=LogisticRegression(), n_features_to_select=10).fit_transform(X, y)

特征重要性评估法

基于一些模型(如各类树模型)可以得到特征重要度,进而进行筛选 。

feature=list(zip(X.columns,model.feature_importances_))

feature=pd.DataFrame(feature,columns=['feature','importances'])

feature.sort_values(by='importances',ascending=False).head(20)

排列性重要评估

原理:在训练机器学习模型之后计算置换重要性。这种方法在向模型提出假设,如果在保留目标和所有其他列的同时随机打乱一列验证集特征数据,对预测机器学习模型的准确性的影响程度。对于一个具有高度重要性的特征,random-reshuffle 会对机器学习模型预测的准确性造成更大的损害。

优点:快速计算;易于使用和理解;特征重要性度量的属性;追求特征稳定性。

Embedded方法

基于惩罚项的特征选取

from sklearn.feature_selection import SelectFromModel

from sklearn.svm import LinearSVC

lsvc = LinearSVC(C=0.01,penalty='l1',dual=False).fit(X, y)

model = SelectFromModel(lsvc,prefit=True)

X_sfm_svm = model.transform(X)

基于树模型的特征选取

from sklearn.feature_selection import SelectFromModel

from sklearn.ensemble import GradientBoostingClassifier

#GBDT 作为基模型的特征选择

gbdt = GradientBoostingClassifier()

X_sfm_gbdt = SelectFromModel(gbdt).fit_transform(X, y)

特征选取小结

过滤法(Filter):基于统计指标(如皮尔逊相关系数、 mutual information、卡方检验等)对每个特征进行评分,然后根据阈值或排名选择特征。

  • 适用场景:处理大规模数据集时特别有效,因为它们通常计算效率高。
  • 优点:计算速度快,独立于模型。
  • 缺点:可能忽略特征间的相互作用。

包裹法(Wrapper):将特征选择视为搜索问题,通过反复训练模型来评估不同特征子集的表现,如递归特征消除(RFE)、前向选择、后向消除等。

  • 适用场景:当特征之间存在较强的相关性,且模型性能是首要考虑因素时。
  • 优点:直接考虑特征组合的效果,可能找到最优特征子集。
  • 缺点:计算成本高,尤其是对于大数据集和复杂模型。

嵌入法(Embedded):在模型训练过程中自动执行特征选择,如正则化(Lasso、Ridge)、决策树的特征重要性等。

  • 适用场景:适合那些内建了特征选择机制的模型,追求效率与效果的平衡。
  • 优点:结合了过滤法和包裹法的优点,既高效又能考虑特征间交互。
  • 缺点:特征选择的标准和过程依赖于特定模型。

基于模型的特征重要性:直接利用模型提供的特征重要性分数来排序和选择特征。

  • 适用场景:当使用像随机森林、梯度提升树等可以自然提供特征重要性的模型时。
  • 优点:直观易用,反映了特征对模型预测能力的贡献。
  • 缺点:可能受到模型自身偏见的影响。

选择特征选取方法时,还应考虑以下几个因素:

  • 数据规模:大规模数据集可能更适合使用过滤法或嵌入法。
  • 计算资源:资源有限时避免使用计算密集型的包裹法。
  • 问题类型:分类、回归、聚类等问题可能对特征的选择有不同的敏感度。
  • 模型复杂度:简单模型可能从特征选择中获益更多,而复杂模型本身已有较好的抗噪能力。
  • 领域知识:了解数据背景可以帮助选择更合理的特征评价标准。

完整特征筛选代码

import numpt as np
import pandas as pd

# 读数据
raw = pd.read_csv('titanic.csv')
print(raw.head(5))

# 特征处理
print(raw.isnull().sum())

# 发现deck缺失值太多了,业务分析影响求生率survived不大,去除
rae = raw.drop('deck', axis =1)

# 年龄缺失值处理,采用分组均值填充
mean= raw.groupby(['pclass', 'sex','who'])['age'].mean()
age_group_mean= raw.groupby(['pclass', 'sex','who'])['age'].mean().reset_index()

def select_group_age(row):
    con = ((row['sex'] == age_group_mean['sex']) & (row['pclass'] == age_group_mean['pclass'])
                 & (row['who'] == age_group_mean['who']))
    # 输出的是每一个列名对应的筛选
    return age_group_mean[con]['age'].values[0]

raw['age'] = raw.apply(lambda x: select_group_age_mean(x) if np.isnan(x['age']) else x['age'], axis=1)

mode_value = raw['embarked'].mode().iloc[0]  # 获取众数
raw['embarked'] = raw['embarked'].fillna(mode_value)

mode_value = raw['embark_town'].mode().iloc[0]  # 获取众数
raw['embark_town'] = raw['embark_town'].fillna(mode_value)

print(raw.isnull().sum())


y = raw['survived']
data = raw.drop(['survived','alive'], axis = 1)

# 对票价做分桶处理,增加票价的鲁棒性
bin_data, fare_bin = pd.qcut(data['fare'], 10, retbins=True)

def cut_fare(x):
    for i in range(len(fare_bin) -1):
        if fare_bin[i] <=x < fare_bin[i+1]:
            return i
    return len(fare_bin) -2

data['fare_bin'] = data['fare'].map(cut_fare)
data = data.drop('fare')


# 区分数值特征和字符串特征
data_numeric = data.select_dtypes(include='number')

# 方差法筛选数值变量,本质是连续变量用方差法比较好
from sklearn.feature_selection import VarianceThreshold
var = VarianceThreshold(0.2)
x_var = var.fit_transform(data_numeric)
del_list = data_numeric.columns[var.get_support() == 0].to_list()
print(del_list)
if len(del_list) > 0:
    data_numeric = data_numeric.drop(del_list, axis=1)



# 用卡方法过滤离散变量,这里面,需要将字符串的离散变量做哑变量处理。 哑变量会引入数值大小影响
data_str = data.select_dtypes(exclude='number')
print("-----------------")
data_dummy = pd.get_dummies(data_str, drop_first=True)
data_com = pd.concat([data_numeric, data_dummy], axis=1)

chi_value, p_vale = chi2(data_com, y)
print(p_vale)

k = chi_value.shape[0] - (p_vale > 0.05).sum()
print(k)
selector = SelectKBest(chi2, k=k).fit(data_com, y)

selected_features_indices = selector.get_support(indices=True)
data_last = data_com.iloc[:, selected_features_indices]

x_fschi = SelectKBest(chi2, k=k).fit_transform(data_com, y)
# 验证模型效果,发现去掉后并没有降低模型效果
value = cross_val_score(RFC(n_estimators=10,random_state=0),x_fschi,y,cv=5).mean()
print(value)
print('k best select columns:{}'.format(k))


# 1. 互信息法进一步筛选特征
from sklearn.feature_selection import mutual_info_classif as MIC
mi_scores = MIC(data_last,y) #得到互信息量的估计
mi_series = pd.Series(mi_scores, index=data_last.columns)
non_zero_mi_features = mi_series[mi_series > 0.03]
date_mic = data_last[non_zero_mi_features.index]
print('MIC select columns:{}'.format(date_mic.shape[1]))

# 2.通过树模型选择特征
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from eli5.sklearn import PermutationImportance

X_train, X_test, y_train, y_test = train_test_split(data_com, y, test_size=0.2, random_state=42)
forest_model = RandomForestClassifier(random_state=0).fit(X_train, y_train)
perm = PermutationImportance(forest_model, random_state=1).fit(X_test, y_test)

print()
print()
print("Feature importances:****************************")
for i in range(X_test.shape[1]):
    print(f"{X_test.columns[i]}: {perm.feature_importances_[i]:.3f}")


# embedded基于惩罚项的特征筛选
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC
lsvc = LinearSVC(C=0.01,penalty='l1',dual=False).fit(data_com, y)
model = SelectFromModel(lsvc, prefit=True)
X_sfm_svm = model.fit(data_com)
selected_features_indices = X_sfm_svm.get_support(indices=True)
print(selected_features_indices)


# 基于树选择特征
from sklearn.ensemble import GradientBoostingClassifier
gbdt = GradientBoostingClassifier()
X_sfm_gbdt = SelectFromModel(gbdt).fit(data_com, y)
print(X_sfm_gbdt.get_support(indices=True))

参考文档:ShowMeAI知识社区

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

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

相关文章

下载 llama2-7b-hf 全流程【小白踩坑记录】

1、文件转换 在官网 https://ai.meta.com/llama/ 申请一个账号&#xff0c;选择要下载的模型&#xff0c;会收到一个邮件&#xff0c;邮件中介绍了下载方法 执行命令 git clone https://github.com/meta-llama/llama.git​ &#xff0c;然后执行 llama/download.sh&#xff0c…

实习项目|苍穹外卖|day9

实战作业。 用户端新增功能 1. 查询历史订单 接口设计 返回的是orderorderdetails&#xff08;那我这里就先查order&#xff0c;再根据order_id查&#xff09; 分页 pageHelper的使用&#xff1a; //controller相关函数GetMapping("/historyOrders")ApiOperati…

线性回归_梯度下降法

from numpy import * import matplotlib.pyplot as plt1.导入数据 # 1.导入数据 # 模型 y wx b points genfromtxt(linear_regress_lsm_data.csv, delimiter,) length len(points) print(point count %d%length) x array(points[:, 0]) y array(points[:, 1]) plt.scatt…

浅谈工业配电系统中漏电产生的成因以及应对方案

摘要 在现代工业厂房的配电系统中&#xff0c;绝缘检测仪作为保障电气设备安全运行的重要工具&#xff0c;发挥着关键作用。本文探讨了绝缘检测仪在工业厂房配电系统中的应用背景、工作原理、具体应用以及其对设备维护与安全管理的影响。通过分析绝缘检测仪在实际操作中的优势…

数据结构修炼——顺序表和链表的区别与联系?从入门到进阶!

目录 一、线性表二、顺序表2.1 概念及结构2.2 接口实现2.3 一些思考以及顺序表的缺点 三、链表3.1 概念及结构3.2 链表的分类3.3 链表的实现3.3.1 无头单向非循环链表3.3.2 带头双向循环链表 四、顺序表和链表的区别 一、线性表 线性表&#xff08;linear list&#xff09;是n…

初级练习[3]:Hive SQL子查询应用

目录 环境准备看如下链接 子查询 查询所有课程成绩均小于60分的学生的学号、姓名 查询没有学全所有课的学生的学号、姓名 解释: 没有学全所有课,也就是该学生选修的课程数 < 总的课程数。 查询出只选修了三门课程的全部学生的学号和姓名 环境准备看如下链接 环境准备h…

【蓝桥杯省赛真题53】Scratch游乐场 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch游乐场 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 scratch游…

Upstage 将发布新一代 LLM “Solar Pro “预览版

Solar Pro 是最智能的 LLM&#xff0c;经过优化可在单 GPU 上运行&#xff0c;性能超过微软、Meta 和谷歌等科技巨头的模型。 加州圣何塞2024年9月11日电 /美通社/ – Upstage 今天宣布发布其下一代大型语言模型 (LLM) Solar Pro 的预览版。加州圣何塞2024年9月11日电 /美通社…

ElementUI大坑Notification修改样式

默认<style lang"scss" scoped>局部样式&#xff0c;尝试用deep透传也无效 实践成功方法&#xff1a;单独写一个style <style> .el-notification{position: absolute !important;top: 40% !important;left: 40% !important; } </style> 也支持自…

无头服务(Headless Service)

无头服务 ​ 无头服务&#xff08;Headless Service&#xff09;是 Kubernetes 中的一种特殊服务类型&#xff0c;主要用于提供稳定的网络标识&#xff0c;而不需要通过负载均衡来分配流量。它允许直接访问 Pod&#xff0c;而不经过集群内的负载均衡器&#xff0c;并且通常用于…

C# net跨平台上位机开发(avalonia)附demo源码

介绍: 目前微软还没有跨平台桌面程序的开发框架。github上有一个团队开始自行研发跨平台桌面框架,其中一款叫avalonia。avalonia 采用 Xaml+C#,类似于wpf,可运行于.netframework,.netcore,是相对比较成熟的.net跨平台桌面应用技术。下面介绍如何创建 avalonia项目;如何在…

mysql_getshell的几种方法

mysql_getshell 一、mysql的--os-shell 利用原理 --os-shell就是使用udf提权获取WebShell。也是通过into oufile向服务器写入两个文件&#xff0c;一个可以直接执行系统命令&#xff0c;一个进行上传文件。此为sqlmap的一个命令&#xff0c;利用这条命令的先决条件&#xff1a;…

PMP--一模--解题--41-50

文章目录 14.敏捷--方法--回顾--回顾是最重要的一个实践&#xff0c;原因是它能让团队学习、改进和调整其过程。41、 [单选] 新项目中的所有团队成员都希望通过尽快交付价值来获得客户的信任。项目经理了解到一个资源已经在其他项目中与发起人一起工作。某资源似乎在使用个人影…

ICM20948 DMP代码详解(20)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;19&#xff09; 本回继续对inv_icm20948_read_mems_reg函数的其余内容进行解析。为了便于理解和回顾&#xff0c;再次贴出inv_icm20948_read_mems_reg函数源码&#xff0c;在EMD-Core\sources\Invn\Devices\Drivers\I…

在docker中安装 zendesk/maxwell 失败,解决方法

文章目录 1、拉取镜像失败2、一键设置镜像加速&#xff1a;修改文件 /etc/docker/daemon.json&#xff08;如果不存在则创建&#xff09;3、保存好之后 执行以下两条命令 1、拉取镜像失败 [rootlocalhost docker]# docker pull zendesk/maxwell Using default tag: latest Err…

有奖直播 | onsemi IPM 助力汽车电气革命及电子化时代冷热管理

在全球汽车行业向电气化和智能化转型的浪潮中&#xff0c;功率管理技术的创新和应用成为了关键驱动力。作为全球领先的半导体解决方案供应商&#xff0c;onsemi&#xff08;安森美&#xff09;致力于通过其先进的智能功率模块&#xff08;IPM&#xff09;技术&#xff0c;推动汽…

Java许可政策再变,Oracle JDK 17 免费期将结束!

原文地址&#xff1a;https://www.infoworld.com/article/3478122/get-ready-for-more-java-licensing-changes.html Oracle JDK 17的许可协议将于9月变更回Oracle Technology Network License Agreement&#xff0c;这将迫使用户重新评估他们的使用策略。 有句老话说&#xf…

【MyBatis---快速学习和复习】

学习视频&#xff08;强推&#xff09;&#xff1a;【MyBatis视频零基础入门到进阶&#xff0c;MyBatis全套视频教程源码级深入详解】 https://www.bilibili.com/video/BV1JP4y1Z73S/?p134&share_sourcecopy_web&vd_source4d877b7310d01a59f27364f1080e3382 MyBatis中…

【算法】-单调队列

目录 什么是单调队列 区域内最大值 区域内最小值 什么是单调队列 说到单调队列&#xff0c;其实就是一个双端队列&#xff0c; 顾名思义&#xff0c;单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增&#xff08;或递减&#xff09;。「队列」指…

Python精选200Tips:126-130

Those who know are not as good as those who love, and those who love are not as good as those who enjoy 126 PyInstaller - 将 Python 程序打包成独立可执行文件的工具示例:图像变为灰度图像项目结构代码文件打包步骤运行可执行文件127 PyYAML - YAML 解析和生成工具示…