机器学习初学者 2024年11月02日
【机器学习】机器学习树模型中超参数优化方法
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

文章介绍了机器学习中树模型的参数优化方法,包括网格搜索、随机搜索、贝叶斯优化、遗传算法、粒子群优化和模拟退火算法的原理及代码实现示例,还提到了作者正在撰写的数分工作相关内容。

🎄网格搜索基于穷举思路,为树模型定义参数网格,遍历参数组合,利用交叉验证评估模型性能,选出最佳参数组合。

🎲随机搜索缓解网格搜索计算复杂度,在参数取值范围内随机选取一定数量组合,通过交叉验证评估性能,找出较好参数组合。

🎯贝叶斯优化基于贝叶斯定理,构建目标函数概率模型,依据已评估点更新模型,推断参数空间分布,选择可能提升性能的参数点评估。

🧬遗传算法模拟生物进化,将参数组合视为个体,通过选择、交叉和变异等操作,使种群向性能更优方向进化,找到较优参数组合。

🐦粒子群优化受鸟群觅食启发,将参数组合看作粒子,根据自身和群体历史最优位置调整速度和位置,在参数空间中搜索合适参数组合。

数分36计OpenDogs 2024-11-01 14:30 浙江

在机器学习的树模型(如决策树、随机森林、梯度提升树等)应用中,模型性能很大程度上取决于参数的合理设置。合适的参数能让模型更好拟合数据、提升预测准确性并避免过拟合等问题。

引言

在机器学习的树模型(如决策树、随机森林、梯度提升树等)应用中,模型性能很大程度上取决于参数的合理设置。合适的参数能让模型更好拟合数据、提升预测准确性并避免过拟合等问题。

常见参数优化方法及原理

网格搜索(Grid Search)

随机搜索(Random Search)

贝叶斯优化(Bayesian Optimization)

遗传算法(Genetic Algorithm)

粒子群优化(Particle Swarm Optimization)

模拟退火算法(Simulated Annealing)

代码实现示例

网格搜索示例(以决策树为例)

from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 定义决策树分类器
dtc = DecisionTreeClassifier()
# 定义要搜索的参数网格
param_grid = {
    'criterion': ['gini''entropy'],
    'max_depth': [None2468],
   'min_samples_split': [2510]
}
# 创建网格搜索对象
grid_search = GridSearchCV(dtc, param_grid, cv=5)
# 执行网格搜索
grid_search.fit(X, y)
# 输出最佳参数组合和对应的最佳得分
print("Best parameters:", grid_search.best_params_)
print("Best score:", grid_search.best_score_)

随机搜索示例(以随机森林为例)

from sklearn.datasets import load_iris
from sklearn.model_selection import RandomSearchCV
from sklearn.ensemble import RandomForestClassifier
import numpy as np
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 定义随机森林分类器
rfc = RandomForestClassifier()
# 定义要搜索的参数分布
param_distributions = {
    'n_estimators': np.arange(5020110),
    'criterion': ['gini''entropy'],
    'max_depth': [None2468],
    'min_samples_split': [2510]
}
# 创建随机搜索对象
random_search = RandomSearchCV(rfc, param_distributions, n_iter=10, cv=5)
# 执行随机搜索
random_search.fit(X, y)
# 输出最佳参数组合和对应的最佳得分
print("Best parameters:", random_search.best_params_)
print("Best score:", random_search.best_score_)

贝叶斯优化示例(以梯度提升树为例)

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from bayes_opt import BayesianOptimization
# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义要优化的参数范围
pbounds = {
    'learning_rate': (0.010.2),
    'n_estimators': (50200),
    'max_depth': (28),
    'min_samples_split': (210)
}
# 定义目标函数,用于评估参数组合的性能
def target_function(learning_rate, n_estimators, max_depth, min_samples_split):
    gbc = GradientBoostingClassifier(
        learning_rate=learning_rate,
        n_estimators=n_estimators,
        max_depth=max_depth,
        min_samples_split=min_samples_split
    )
    gbc.fit(X_train, y_train)
    return gbc.score(X_test, y_test)
# 创建贝叶斯优化对象
optimizer = BayesianOptimization(
    f=target_function,
    pbounds=pbounds
)
# 执行贝叶斯优化
optimizer.maximize(iterations=10)
# 输出最佳参数组合和对应的最佳得分
print("Best parameters:", optimizer.max["params"])
print("Best score:", optimizer.max["target"])

遗传算法示例(以决策树为例)

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 定义决策树分类器
dtc = DecisionTreeClassifier()
# 定义适应度函数
def fitness_function(params):
    dtc.set_params(**params)
    scores = cross_val_score(dtc, X, y, cv=5)
    return np.mean(scores)
# 定义遗传算法参数
population_size = 20
num_generations = 10
mutation_rate = 0.1
# 随机生成初始种群
initial_population = [
    {
        'criterion': np.random.choice(['gini''entropy']),
        'max_depth': np.random.choice([None2468]),
       'min_samples_split': np.random.choice([2510])
    } for _ in range(population_size)
]
# 迭代遗传算法过程
for generation in range(num_generations):
    # 计算种群中每个个体的适应度
    fitness_scores = [fitness_function(individual) for individual in initial_population]
    # 选择操作
    selected_indices = np.argsort(fitness_scores)[-population_size // 2:]
    selected_population = [initial_population[i] for i in selected_indices]
    # 交叉操作
    new_population = []
    for i in range(len(selected_population)):
        for j in range(len(selected_population)):
            if i!= j:
                child = {}
                for key in selected_population[i].keys():
                    if np.random.rand() < 0.5:
                        child[key] = selected_population[i][key]
                    else:
                    child[key] = selected_population[j][key]
                new_population.append(child)
    # 变异操作
    for individual in new_population:
        if np.random.rand() < mutation_rate:
            key = np.random.choice(list(individual.keys()))
            if key == 'criterion':
                individual[key] = np.random.choice(['gini''entropy'])
            elif key == 'max_depth':
                individual[key] = np.random.choice([None2468])
            elif key == 'min_samples_split':
                individual[key] = np.random.choice([2510])
    initial_population = new_population
# 输出最佳参数组合和对应的最佳得分
best_params = max(initial_population, key=fitness_function)
print("Best parameters:", best_params)
print("Best score:", fitness_function(best_params))

粒子群优化示例(以随机森林为例)

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 定义随机森林分类器
rfc = RandomForestClassifier()
# 定义适应度函数
def fitness_function(params):
    rfc.set_params(**params)
    scores = cross_val_score(rfc, X, y, cv=5)
    return np.mean(scores)
# 定义粒子群优化参数
num_particles = 20
max_iterations = 10
w = 0.5
c1 = 1.5
c2 = 1.5
# 随机生成初始粒子群
initial_particles = [
    {
        'n_estimators': np.random.randint(50201),
        'criterion': np.random.choice(['gini''entropy']),
        'max_depth': np.random.choice([None2468]),
        'min_samples_split': np.random.choice([2510])
    } for _ in range(num_particles)
]
# 初始化粒子的速度
initial_velocities = [
    {
        'n_estimators': np.random.randn(),
        'criterion': np.random.randn(),
        'max_depth': np.random.randn(),
        'min_samples_split': np.random.randn()
    } for _in range(num_particles)
]
# 迭代粒子群优化过程
for iteration in range(max_iterations):
    # 计算粒子群中每个粒子的适应度
    fitness_scores = [fitness_function(particle) for particle in initial_particles]
    # 找到每个粒子的历史最优位置和群体历史最优位置
    personal_best_positions = []
    global_best_position = max(initial_particles, key=fitness_function)
    for i, particle in enumerate(initial_particles):
        if fitness_function(particle) >= fitness_function(personal_best_positions[i - 1]):
            personal_best_positions[i] = particle
        else:
            personal_best_positions[i] = personal_best_positions[i - 1]
    # 更新粒子的速度和位置
    for i, particle in enumerate(initial_particles):
        for key in particle.keys():
            r1 = np.random.rand()
            r2 = np.random.rand()
            velocity = w * initial_velocities[i][key] + c1 * r1 * (personal_best_positions[i][key] - particle[key]) + c2 * r2 * (global_best_position[key] - particle[key])
            particle[key] = particle[key] + velocity
            initial_velocities[i][key] = velocity
# 输出最佳参数组合和对应的最佳得分
best_params = global_best_position
print("Best parameters:", best_params)
print("Best score:", fitness_function(best_params))

模拟退火算法示例(以梯度提升树为例)

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier
# 加载鸢尾花数据集
iris = 680 iris.dataset.load_iris()
X = iris.data
y = iris.target
# 定义梯度提升树分类器
gbc = GradientBoostingClassifier()
# 定义适应度函数
def fitness_function(params):
    gbc.set_params(**params)
    scores = cross_val_score(gbc, X, y, cv=5)
    return np.mean(scores)
# 定义模拟退火算法参数
initial_temperature = 100
final_temperature = 1
temperature_decay_rate = 0.9
# 随机生成初始参数组合
initial_params = {
    'learning_rate': np.random.uniform(0.010.2),
    'n_estimators': np.random.uniform(50200),
    'max_depth': np.random.uniform(28),
    'min_samples_split': np.random.uniform(210)
}
# 迭代模拟退火算法过程
while initial_temperature > final_temperature:
    # 生成邻近的参数组合
    new_params = {
        'learning_rate': initial_params['learning_rate'] + np.random.uniform(-0.10.1),
        'n_estimators': initial_params['n_estimators'] + np.random.uniform(-0.10.1),
        'max_depth': initial_params['max_depth'] + np.random.uniform(-0.10.1),
        'min_samples_split': initial_params['min_samples_split'] + np.random.uniform(-0.10.1)
    }
    # 计算新旧参数组合的适应度
    old_fitness = fitness_function(initial_params)
    new_fitness = fitness_function(new_params)
    # 根据温度和适应度决定是否接受新参数组合
    if new_fitness > old_fitness or np.random.rand() < np.exp((new_fitness - old_fitness) / initial_temperature):
        initial_params = new_params
    # 降低温度
    initial_temperature *= temperature_decay_rate
# 输出最佳参数组合和对应的最佳得分
print("Best parameters:", initial_params)
print("Best score:", fitness_function(initial_params))


作者介绍:数分36计OpenDogs

目前正在撰写数分工作4部曲:AB实验、因果模型、归因分析、机器学习等;让同学们在工作、面试中没有短板!

所以你并没有超过95%的人,只是平均水平而已。

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

机器学习 树模型 参数优化 算法原理
相关文章