当前位置: 首页 > news >正文

机器学习复习

一、knn算法

全称是k-nearest neighbors,通过寻找k个距离最近的数据,来确定当前数据值的大小或类别。是机器学习中最为简单和经典的一个算法。

优点: 1.简单,易于理解,易于实现,无需训练;

2.适合对稀有事件进行分类;

3.对异常值不敏感。

缺点︰ 1.样本容量比较大时,计算时间很长;

⒉.不均衡样本效果较差;

n_neighbors : k,邻居的个数,默认5关键参数

p : 距离的计算方式。P=1曼哈顿距离,p=2欧式距离。

from sklearn.neighbors import KNeighborsClassifier

二、线性回归算法

核心目标是建立自变量(特征)与因变量(标签)之间的线性关系模型,用于预测连续型输出

线性回归用 “均方误差(MSE)” 作为损失函数

优点

  1. 简单易理解:模型形式直观,权重可解释(如 “w₁=5000” 表示 “面积每增加 1㎡,房价增加 5000 元”);
  2. 训练效率高:梯度下降迭代快,正规方程可直接求解;
  3. 可扩展性强:是岭回归、Lasso 回归、逻辑回归(分类任务)等算法的基础。

缺点

  1. 只能拟合线性关系:无法处理自变量与因变量的非线性关联(如 “年龄与收入” 可能是二次关系);
  2. 对异常值敏感:MSE 损失会放大异常值的影响(如极端高房价样本会严重偏离拟合直线);
  3. 特征依赖强:需手动筛选有效特征,且无法自动捕捉特征间的交互作用(如 “面积 × 楼层” 的联合影响)。

预测类任务:房价预测、销量预测、股票价格趋势预测、气温预测;

from sklearn.linear_model import LinearRegression

三、逻辑回归算法

 核心功能是解决分类问题

逻辑回归通过 “转换函数”用sigmod函数 将线性回归的连续输出映射到 **[0,1] 区间的概率值 **,再根据概率阈值(通常是 0.5)判断类别

from sklearn.linear_model import LogisticRegression

逻辑回归采用对数损失(Log Loss),也叫交叉熵损失

优点:

  1. 可解释性强:权重wj​的正负和大小直接反映特征的影响 —— 例如wj​>0表示该特征增强正类概率,wj​的绝对值越大,影响越强;
  2. 计算高效:模型参数少,训练和预测速度快,适合大规模数据;
  3. 输出概率值:不仅能分类,还能给出 “置信度”(如 “90% 概率是垃圾邮件”),便于后续决策;
  4. 抗过拟合能力:可通过 “正则化(L1/L2)” 控制参数大小,减少过拟合(L1 正则化还能实现特征选择)。

缺点:

  1. 仅适用于二分类:原生逻辑回归只能处理 “是 / 否” 类问题,多分类需通过 “One-vs-Rest”(一对多)或 “One-vs-One”(一对一)扩展;
  2. 对非线性数据拟合差:逻辑回归本质是 “线性分类器”,若特征与标签呈非线性关系(如 “环形分布”),需先通过特征工程(如多项式特征、核函数)转换特征;
  3. 对异常值敏感:异常值会严重影响线性得分z,进而扭曲概率预测,需提前处理异常值。

Penalty正则化方式,有l1和l2两种。用于指定惩罚项中使用的规范

C:正则化强度。为浮点型数据。正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化。

优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低。

缺点:容易欠拟合,分类精度可能不高。

过拟合问题:

核心特征是模型在训练数据上表现极佳,但对未见过的新数据(测试数据 / 真实场景数据)泛化能力极差

过拟合的本质是模型复杂度与数据复杂度不匹配

过采样(Oversampling) 和 下采样(Undersampling) 是两类核心的重采样技术,主要用于解决类别不平衡问题

过采样核心思想:不改变多数类样本数量,通过 “生成 / 复制少数类样本”,让少数类的样本量接近多数类。本质是 “给少数类‘增重’”,让模型更关注少数类特征。

下采样核心思想:不改变少数类样本数量,通过 “删除多数类样本”,让多数类的样本量接近少数类。本质是 “给多数类‘减重’”,降低模型对多数类的偏向性。

1. 归一化(Normalization)

归一化通常指将数据缩放到 [0, 1] 或 [-1, 1] 的固定区间 ,也称为 “Min-Max 缩放”。最常见的是缩放到 [0, 1] 区间。

公式(缩放到 [0, 1]):
对于特征数据集中的每个样本值 x:Xnorm​=X−min(X)/max(X)−min(X)​
其中:min(X) 是特征 X 的最小值;max(X) 是特征 X 的最大值。

2. Z 标准化(Z-Score Standardization)

Z 标准化将数据转换为均值为 0、标准差为 1 的分布,也称为 “标准化” 或 “标准差标准化”。转换后的数据称为 “Z 分数”(Z-Score)。

公式:
对于特征数据集中的每个样本值 x:Xstd​=X−μ/σ​
其中:μ 是特征 X 的均值(Mean);σ 是特征 X 的标准差(Standard Deviation)。


四、决策树算法

树模型参数:max_depth: 表示树的最大深度;

5.min_samples_split (表示分裂一个内部节点需要的最小样本数,默认为2),如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值;

min_samples_leaf 叶子节点最少样本数),这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,如果样本量不大,不需要管这个值;

max_leaf_nodes 最大叶子节点数),通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到。

criterion :gini or entropy 【采用基尼系数还是熵值衡量,默认基尼系数

优点:

  1. 极强的可解释性:树形结构直观,可直接可视化(如用 Graphviz 绘制),非技术人员也能理解决策逻辑(比如 “为什么判断这个用户会购买?因为年龄> 30 岁且月收入 > 8000 元”)。
  2. 无需特征预处理:不需要对特征进行标准化 / 归一化(如 “年龄” 和 “收入” 单位不同,不影响决策树分裂),也能处理非线性特征(如 “年龄” 和 “购买意愿” 的非线性关系)。
  3. 适用场景广:同时支持分类任务(如 “垃圾邮件识别”)和回归任务(如 “销量预测”)。
  4. 抗噪性较强:对部分噪声数据不敏感(尤其通过剪枝后)。

缺点:

  1. 易过拟合:未剪枝的决策树复杂度高,泛化能力差(需通过剪枝或集成学习改进)。
  2. 对异常值敏感:极端异常值(如 “月收入 1 亿”)可能导致节点分裂偏向异常值,影响整体模型。
  3. 容易产生偏斜树:若数据类别不平衡(如 90% 是 “不购买”,10% 是 “购买”),决策树可能倾向于预测多数类,忽略少数类。
  4. 稳定性差:训练数据微小变化(如新增 1 个样本)可能导致树的结构发生巨大变化,模型结果不稳定。

五、随机森林

基于决策树的集成学习(Ensemble Learning)算法

from sklearn.ensemble import RandomForestClassifier

n_estimators :(随机森林独有)随机森林中决策树的个数

criterion :同决策树

节点分割依据,默认为基尼系数。

可选【entropy:信息增益】

max_depth:(同决策树【重要】

default=(None)设置决策树的最大深度,默认为None。

(1)数据少或者特征的时候,可以不用管这个参数,按照默认的不限制生长即可

(2)如果数据比较多特征也比较多的情况下,可以限制这个参数,范围在10~100之间比较好

min_samples_split : (同决策树)【重要】

这个值限制了子树继续划分的条件,如果某节点的样本数少于设定值,则不会再继续分裂。默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则建议增大这个值。

min_samples_leaf :(同决策树)【重要】

这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

max_features : (随机森林独有)【重要】

随机森林允许单个决策树使用特征的最大数量。选择最适属性时划分的特征不能超过此值。

六、贝叶斯

贝叶斯定理是所有贝叶斯算法的数学基础,它描述了 “先验概率” 如何通过 “似然度” 和 “证据” 更新为 “后验概率”。

from sklearn.naive_bayes import MultinomialNB

高斯朴素贝叶斯(Gaussian NB) | 特征为连续值(如身高、体重、温度) | 给定类别y时,特征xi​服从高斯分布(正态分布) | 基于身高、体重预测性别;基于气温、湿度预测天气类型 |
多项式朴素贝叶斯(Multinomial NB) | 特征为离散计数(如文本中词的出现次数) | 给定类别y时,特征xi​服从多项式分布 | 文本分类(如垃圾邮件识别:特征为 “关键词出现次数”);文档主题分类 |
伯努利朴素贝叶斯(Bernoulli NB) | 特征为二值变量(如 “有 / 无”“是 / 否”) | 给定类别y时,特征xi​服从伯努利分布(0-1 分布) | 文本分类(特征为 “关键词是否出现”,而非出现次数);用户行为预测(如 “是否点击链接”) |

朴素贝叶斯

  • 优点

    1. 计算速度快:仅需统计先验概率和似然度,无需迭代训练;
    2. 数据需求少:小样本即可训练(尤其适合数据稀缺场景);
    3. 支持多分类:天然适配多类别任务(如文本主题分为 “科技”“娱乐”“教育”);
    4. 概率可解释:输出结果是 “属于某类别的概率”,便于理解决策逻辑。
  • 缺点

    1. 特征独立假设过强:实际数据中特征常存在依赖(如 “身高” 和 “体重” 相关),会导致预测偏差;
    2. 对 “零概率” 敏感:若某特征在某类别中从未出现(如 “关键词 A 在正常邮件中从未出现”),会导致∏P(xi​∣y)=0,需通过 “拉普拉斯平滑” 修正。

贝叶斯

优点:

理论基础坚实:贝叶斯算法基于贝叶斯定理,它为概率模型的学习和推理提供了明确的理论框架。

易于实现:贝叶斯算法的逻辑简单,只要使用贝叶斯公式转化即可,因此易于实现。

分类过程中时空开销小:贝叶斯算法假设特征之间相互独立,因此在分类过程中,只会涉及到二维存储,大大降低了时空开销。

易于并行化:贝叶斯算法可以很方便地进行并行化处理,提高计算效率。

缺点:

假设前提:贝叶斯算法假设样本特征彼此独立,这个假设在实际应用中往往是不成立的,尤其在属性个数比较多或者属性之间相关性较大时,分类效果不好。

对噪声敏感:如果数据中存在大量噪声,贝叶斯算法可能会表现不佳。

模型选择:贝叶斯算法需要对模型进行正确的选择,如果模型选择不当,可能会导致算法性能下降。

高维特征空间的应用限制:贝叶斯算法在处理高维特征空间时可能会遇到困难,因为高维空间中的数据通常具有稀疏性,这会导致贝叶斯网络的学习和推理变得非常困难。

参数:

alpha: 控制模型拟合时的平滑度

fit_prior: 是否去学习类的先验概率

 class_prior: 各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一

七、SVM算法

核心思想是 “找到最优超平面实现样本分类”,在小样本、高维空间(如文本分类)中表现优异,既可用于分类(SVC),也可用于回归(SVR)。

from sklearn.svm import SVC、from sklearn.svm import SVR

实际场景中,样本往往线性不可分(如环形分布的两类样本)。此时 SVM 通过核函数(Kernel Function) 将低维特征空间的数据映射到高维空间,使原本线性不可分的数据在高维空间变得线性可分。

惩罚因子【浮点数,默认为1.】【软间隔】

 (1)C越大,对误分类的惩罚增大,希望松弛变量接近0,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱;

(2)C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。

->>建议通过交叉验证来选择

kernel: 核函数【默认rbf(径向基核函数|高斯核函数)】

可以选择线性(linear)、多项式(poly)、sigmoid

->>多数情况下选择rbf

degree:【整型,默认3维】

多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。

->>按默认【选择rbf之后,此参数不起作用】

 gamma: ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’。

(1)如果gamma是’auto’,那么实际系数是1 / n_features,也就是数据如果有10个特征,那么gamma值维0.1。(sklearn0.21版本)

(2)在sklearn0.22版本中,默认为’scale’,此时gamma=1 / (n_features*X.var())#X.var()数据集所有值的方差。

<1>gamma越大,过拟合风险越高

<2> gamma越小,过拟合风险越低

->>建议通过交叉验证来选择

八、K-means聚类算法

from sklearn.cluster import KMeans

核心目标是将无标签的数据集自动划分成K个(用户预先指定)“相似” 的簇(Cluster),实现 “簇内数据相似度高、簇间数据相似度低” 的效果。

简单理解:

先随机选K个点作为初始 “质心”(每个质心代表一个簇的中心);

把每个样本分配到距离最近的质心所在的簇;

重新计算每个簇的新质心(簇内所有样本的均值);

重复 “分配样本→更新质心” 的过程,直到质心位置不再变化(或变化小于阈值),此时聚类结果稳定。

1. K 值的选择(核心难题)

K-means 无法自动确定K,需通过以下方法选择最优K

肘部法则(Elbow Method)
绘制 “K 值 - SSE” 曲线,随着K增大,SSE 会逐渐减小(簇数越多,每个簇越紧凑);当K增加到某个值后,SSE 的下降幅度会突然变缓(曲线出现 “肘部”),这个 “肘部” 对应的K就是最优值。
例:若 K=3 时 SSE 从 1000 降到 500,K=4 时从 500 降到 480,K=5 时从 480 降到 470,则 K=3 是肘部,为最优值。

轮廓系数(Silhouette Coefficient)
对每个样本计算 “轮廓系数”,取值范围[-1,1]

系数接近 1:样本与所在簇高度相似,与其他簇差异大,聚类效果好;

系数接近 - 1:样本可能被分配到错误的簇;

计算所有样本的平均轮廓系数,选择系数最大的K

优点

  1. 简单高效:原理直观,计算复杂度低(时间复杂度O(n*K*t)n为样本数,t为迭代次数),适合大规模数据集;
  2. 可扩展性强:支持增量更新(如新增样本时,无需重新聚类所有数据);
  3. 结果易解释:簇的划分清晰,质心可作为簇的 “特征代表”(如客户分群后,质心可反映该类客户的平均消费、年龄等)。

缺点

  1. 对 K 值敏感:必须预先指定K,且K的微小变化可能导致聚类结果完全不同;
  2. 受初始质心影响:随机初始化可能陷入 “局部最优”(而非全局最优),需多次运行取最优;
  3. 对异常值敏感:异常值会显著拉高簇的质心(因为均值对异常值鲁棒性差),导致聚类偏移;
  4. 仅适用于凸簇:无法处理非凸形状的簇(如环形、螺旋形数据),因为基于距离的分配会将非凸簇误分为多个凸簇;
  5. 依赖数据分布:假设所有簇的方差相同、样本数量相近,若数据分布不均(如某簇样本极多,某簇极少),聚类效果差。

n_clusters: 类中心的个数,就是要聚成几类。【默认8个】

init初始化的方法,默认为'k-means++'

(1)'k-means++': 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛.

(2) ‘random’:  随机从训练数据中选取初始质心。

(3) 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

n_init: 整形,缺省值=10

用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。

max_iter :

执行一次k-means算法所进行的最大迭代数。

Tol: 与inertia结合来确定收敛条件。

precompute_distances三个可选值,‘auto’,True 或者 False

预计算距离,计算速度更快但占用更多内存。

(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。

(2)True:总是预先计算距离。

(3)False:永远不预先计算距离。

verbose:整形,默认值=0

random_state :随机状态

copy_x:布尔型,默认值=True

当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据 上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

algorithm:'auto','full' or 'elkan'.默认为'auto'
full:采用经典的EM算法
elkan:通过使用三角不等式从而更有效,但不支持稀疏数据
auto:数据稀疏选择full模式,数据稠密选择elkan模式

九、DBSCAN算法

from sklearn.cluster import DBSCAN

优点

  1. 无需预设簇数量:区别于 K-means,DBSCAN 自动识别簇的数量;
  2. 处理任意形状簇:能正确聚类环形、螺旋形等非凸结构的簇(K-means 对此失效);
  3. 抗噪声能力强:直接将低密度点标记为噪声,不受异常值干扰;
  4. 聚类结果稳定:对同一参数设置,结果唯一(无随机初始化问题)。

缺点

  1. 参数敏感:ε 和 MinPts 的微小变化可能导致聚类结果差异很大;
  2. 高维数据表现差:高维空间中 “距离” 的定义变得模糊(维度灾难),ε 难以设置;
  3. 密度不均数据难处理:对密度差异大的簇(如一个密集簇和一个稀疏簇),无法同时兼顾;
  4. 计算复杂度较高:时间复杂度为 O (n²)(n 为样本数),不适合超大规模数据(可通过空间索引优化至 O (n log n))。

eps DBSCAN算法参数,即我们的ϵϵ-邻域的距离阈值,和样本距离超过ϵϵ的样本点不在ϵϵ-邻域内。默认值是0.5.一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。

min_samples: DBSCAN算法参数,即样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值。默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。

十、TF-IDF算法

核心作用是将文本转换为数值特征,同时衡量一个词在文档中的 “重要性”—— 既考虑词在当前文档中的出现频率,又兼顾其在整个语料库中的普遍程度,最终过滤掉常见词(如 “的”“是”),突出有区分度的词(如专业术语)。

TF-IDF 由两部分组成:词频(TF) 和逆文档频率(IDF),最终特征值为两者的乘积。

1. 词频(TF):词在当前文档中的出现频率

TF 衡量一个词在单篇文档中的出现频率,计算公式有多种,最常用的是:
TF(t,d)=文档d的总词数词t在文档d中出现的次数​

含义:词 t 在文档 d 中出现得越频繁,TF 值越高,说明它在该文档中可能越重要;

其他形式:也可用 “原始出现次数” 作为 TF(不做归一化),但归一化后更能避免文档长度对结果的影响(长文档的词出现次数天然更高)。

2. 逆文档频率(IDF):词在整个语料库中的罕见程度

IDF 衡量一个词在所有文档(语料库) 中的普遍程度,计算公式为:
IDF(t)=log(包含词t的文档数+1语料库中文档总数+1​)+1

含义:若词 t 仅在少数文档中出现(包含 t 的文档数少),则 IDF 值高,说明 t 具有强区分度;若 t 在多数文档中都出现(如 “的”),则 IDF 值低,说明 t 是通用词;

公式中的 “+1” 是平滑处理,避免 “包含词 t 的文档数 = 0” 时分母为 0(此时 IDF 会被计算为总文档数,而非无穷大);

对数底数通常取 2 或自然对数,不影响相对大小。

3. TF-IDF 的最终计算

将 TF 和 IDF 相乘,得到词 t 在文档 d 中的 TF-IDF 值:
TF-IDF(t,d)=TF(t,d)×IDF(t)

结果含义:值越高,说明词 t 在文档 d 中 “既重要又独特”,是该文档的核心特征。

from sklearn.feature_extraction.text import TfidfVectorizer

优点

  1. 简单高效:原理直观,计算复杂度低,适合大规模文本数据;
  2. 可解释性强:结果可直接对应 “词的重要性”,易于理解;
  3. 过滤通用词:通过 IDF 天然过滤 “的”“是” 等无意义词,保留有区分度的特征。

缺点

  1. 忽略语义和上下文:仅基于词频统计,无法理解词的语义(如 “苹果” 既指水果也指公司),也不考虑词的位置和上下文关系(如 “我爱你” 和 “你爱我” TF-IDF 相同);
  2. 对低频重要词不友好:若一个词在文档中出现次数少(TF 低),即使 IDF 高,TF-IDF 值也可能偏低(如专业术语 “Transformer” 在某篇文档中只出现 1 次);
  3. 依赖语料库:IDF 计算受语料库影响,若语料库不具代表性(如样本太少),结果会偏差。

十一、词向量转换评论学习项目分析

核心是将非结构化的评论文本(如电商评价、外卖反馈、酒店评论等)转换为计算机可理解的数值向量(词向量),再基于词向量完成情感分析、主题挖掘、用户需求识别等下游任务。该项目的核心价值在于 “让文本‘可计算’”,最终为业务决策(如商品优化、服务改进、用户分层)提供数据支撑。

from sklearn.feature_extraction.text import CountVectorizer

十二、PCA降维

核心目标是在损失尽可能少的数据信息的前提下,将高维数据映射到低维空间(即 “主成分” 方向),从而解决 “维度灾难”(高维数据计算量大、冗余信息多、模型泛化能力差等问题)。

十三、数据清洗

http://www.dtcms.com/a/357207.html

相关文章:

  • 使用 C# 复制 Word 文档内容 - 页面、节、段落、表格、页眉页脚等
  • 对接连连支付(八)-- 支付订单关闭
  • 52-容器总结与应用
  • LeetCode259~282题解
  • 使用STM32CubeMX使用CAN驱动无刷电机DJI3508
  • 多智能体框架(下)
  • 【系列03】端侧AI:构建与部署高效的本地化AI模型 第2章:端侧AI硬件入门
  • c++ 右值引用
  • 从零开始的python学习——常量与变量
  • 【STM32外设】ADC
  • OSS Nginx 反代提示 SignatureDoesNotMatch
  • 网络_协议
  • (十)ps识别:Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型训练过程解析
  • 链表有环找入口节点原理
  • Vue3 + TS + MapboxGL.js 三维地图开发项目
  • Marin说PCB之POC电路layout设计仿真案例---11
  • Jenkins Pipeline(二)-设置Docker Agent
  • 渲染速度由什么决定?四大关键因素深度解析
  • 【拍摄学习记录】07-影调、直方图量化、向右向左
  • Docker部署openai-edge-tts和即梦API以及应用案例
  • 透视文件IO:从C库函数的‘表象’到系统调用的‘本质’
  • 12、做中学 | 初一上期 Golang函数 包 异常
  • electron-vite 配合python
  • AI驱动万物智联:IOTE 2025深圳展呈现无线通信×智能传感×AI主控技术融合
  • 软件系统的部署方式:单机、主备(冷主备、热主备)、集群
  • LeetCode100-54螺旋矩阵
  • Verilog 硬件描述语言自学——重温数电之组合逻辑电路
  • 高性能 JSON:System.Text.Json Source Generator vs 手写 Span(Utf8JsonReader/Writer)
  • 并发编程——06 JUC并发同步工具类的应用实战
  • 如何高效批量完成修改文件名的工作?