基于粒子群优化算法(PSO)的超参数调优(分类模型)

相关文章:

  1. 粒子群优化算法(原理)
  2. 粒子群优化算法(实战)
  3. 使用粒子群优化聚类(实战)
  4. 基于粒子群优化算法的特征选择

1 GlobalBestPSO() 函数简介

PSO 超参数调优采用的是 pyswarm 包中的 GlobalBestPSO()

class pyswarms.single.global_best.GlobalBestPSO(n_particles, dimensions, options, bounds=None, oh_strategy=None, bh_strategy=‘periodic’, velocity_clamp=None, vh_strategy=‘unmodified’, center=1.0, ftol=-inf, ftol_iter=1, init_pos=None)

输入参数:

  • n_particles:整数,粒子群中的粒子数量
  • dimension:整数,空间维度,或特征维度
  • options:系数,字典形式 {‘c1’=2, ‘c2’=2, ‘w’=0.3}
  • bounds:数组,可选,行数为 2,第一行是边界的最小值,第二行是边界的最大值
  • oh_strategy:字典,可选,每个 option 的选择策略
  • bh_strategy:字符串,处理超出边界的粒子的策略
  • velocity_clamp:元组,可选,一个大小为2的元组,其中第一个条目是最小速度,第二个条目是最大速度。它设定了速度的限制
  • vh_strategy:字符串,处理超出边界的粒子速度的策略
  • ftol:列表(默认为None),

GlobalBestPSO()的优化方法

optimize(objective_func, iters, n_processes=None, verbose=True, **kwargs)

输入参数:

  • objective_func (function):自适应函数或损失函数
  • iters (int):迭代次数
  • kwargs (dict) :目标函数的参数

返回:

  • tuple:目标函数最优值和最优位置

2 定义PSO优化器

import numpy as np
import pyswarms as ps
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.model_selection import cross_val_score

n_particles = 10
cv = 5
options = {'c1': 0.5, 'c2': 0.5, 'w': 0.9}
optimizer = ps.single.GlobalBestPSO(n_particles=n_particles, dimensions=dims,
                                    options=options, bounds=bounds)

3 定义参数和边界

这里选择逻辑回归模型的超参数:C 和 penalty。

# 超参数 C 和 penalty
C = [0., 1.]
penalty = ['l1', 'l2', 'elasticnet', 'none']
penalty_bound = [0, len(penalty)]  # 把这个看作索引
dims = 2

# bounds表示所有参数的界限
max_ = np.zeros(dims)
min_ = np.zeros(dims)

for i, param in enumerate([C, penalty_bound]):
    min_[i] = param[0]
    max_[i] = param[1]

bounds = (min_, max_)
print(bounds)

输出:

(array([0., 0.]), array([1., 4.]))

4 得到最优模型

# 这里目标函数的输入为需要优化的参数
best_cost, best_pos = optimizer.optimize(objective, iters=25)
print(best_pos, penalty[int(best_pos[1])])
best_model = LogisticRegression(C=best_pos[0], penalty=penalty[int(best_pos[1])])
best_model = best_model.fit(X_train, y_train)

输出:

[0.01806252 1.430832  ] l2

5 定义目标函数

在定义目标函数时,需要将每个粒子的值带入模型中训练,然后返回模型的指标值。这个指标值可以是分类中的准确率。

具体如下:

def objective(param):
    """计算每个粒子的适应度,param表示输入的参数(n_particles, n_dims)"""
    scores = np.zeros((n_particles, cv))
    clf = LogisticRegression
    for i in range(n_particles):
        """计算每个粒子的得分"""
        scores[i, :] = cross_val_score(clf(C=param[i][0], penalty=penalty[int(param[i][1])]),
                                       X_train, y_train,
                                       scoring='accuracy',
                                       cv=cv)
    return -np.mean(scores, axis=1)

6 查看损失变化

查看目标函数随迭代增加的变化情况:

from pyswarms.utils.plotters import plot_cost_history
plot_cost_history(cost_history=optimizer.cost_history)

7 测试模型

X, y = make_classification(n_samples=2000, n_features=5, random_state=42)

X_train, y_train = X[:1000], y[:1000]
X_test, y_test = X[1000:], y[1000:]

y_pred = best_model.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

输出:

[[440  55]
 [ 45 460]]
              precision    recall  f1-score   support
           0       0.91      0.89      0.90       495
           1       0.89      0.91      0.90       505
    accuracy                           0.90      1000
   macro avg       0.90      0.90      0.90      1000
weighted avg       0.90      0.90      0.90      1000
好的,我了解了你的问题。粒子群算法和随机森林都是常用的机器学习算法粒子群算法是一种优化算法,而随机森林是一种集成学习算法调参是机器学习中非常重要的一步,下面我将分别介绍粒子群算法和随机森林的调参方法。 对于粒子群算法,常用的调参方法有以下几个: 1. 粒子数:粒子数是影响算法性能的重要参数,一般来说,粒子数越多,算法的搜索能力越强,但同时也会增加计算时间。因此,需要根据实际情况选择合适的粒子数。 2. 惯性权重:惯性权重是控制粒子运动方向的参数,一般取值范围为[0,1]。较大的惯性权重可以加快算法的收敛速度,但可能会导致算法陷入局部最优解;较小的惯性权重可以增加算法的全局搜索能力,但可能会导致算法收敛速度变慢。因此,需要根据实际情况选择合适的惯性权重。 3. 学习因子:学习因子是控制粒子速度的参数,一般取值范围为[0,2]。较大的学习因子可以加快算法的收敛速度,但可能会导致算法陷入局部最优解;较小的学习因子可以增加算法的全局搜索能力,但可能会导致算法收敛速度变慢。因此,需要根据实际情况选择合适的学习因子。 4. 迭代次数:迭代次数是控制算法运行时间的参数,一般需要根据实际情况选择合适的迭代次数。如果迭代次数太少,可能会导致算法无法收敛;如果迭代次数太多,可能会浪费计算资源。 对于随机森林,常用的调参方法有以下几个: 1. 决策树数量:随机森林中包含多个决策树,决策树数量是影响算法性能的重要参数。一般来说,决策树数量越多,算法分类性能越好,但同时也会增加计算时间。因此,需要根据实际情况选择合适的决策树数量。 2. 样本数量:随机森林中每个决策树都是基于随机样本构建的,样本数量是影响算法性能的重要参数。一般来说,样本数量越多,算法分类性能越好,但同时也会增加计算时间。因此,需要根据实际情况选择合适的样本数量。 3. 特征数量:随机森林中每个决策树都是基于随机特征构建的,特征数量是影响算法性能的重要参数。一般来说,特征数量越多,算法分类性能越好,但同时也会增加计算时间。因此,需要根据实际情况选择合适的特征数量。 4. 最大深度:决策树的最大深度是控制决策树复杂度的参数。一般来说,最大深度越大,决策树越复杂,可能会导致过拟合;最大深度越小,决策树越简单,可能会导致欠拟合。因此,需要根据实际情况选择合适的最大深度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值