如何使用遗传算法来调整ML模型的超参数?

865 阅读7分钟

在ML模型的开发过程中,用优化算法正确地探索超参数空间可以为模型找到理想的超参数。超参数是机器学习中在学习过程开始前指定的一个参数。对模型的超参数进行微调可以提高模型在验证集上的表现。本文将重点讨论使用遗传算法对分类器的超参数进行微调。以下是将要涉及的主题。

目录

  1. 关于超参数调整
  2. 超参数调整的工作原理
  3. 遗传算法是如何用于超参数优化的?
  4. 实施GA的调谐模型

根据学习率、集群数量等,超参数可以分为连续、离散或分类。让我们来看看超参数调优的情况。

关于超参数调整

在基本情况下,所有的超参数都可以是无约束的实值,可行的超参数集可以是一个具有实值的n维向量空间。然而,由于ML模型的超参数可以从多个领域取值,并有不同的约束条件,其优化问题经常是复杂的约束优化问题。

例如,在决策树中,受检特征的数量应该在0到特征数量的范围内,而k-means中的聚类数量不应该大于数据点的数量。此外,分类特征,如神经网络的激活函数和优化器,经常只能取几个特定的值。因此,超参数集合的可行域经常有一个复杂的结构,增加了问题的复杂性。

超参数调整方法有四个主要组成部分。

  • 一个具有目标函数的估计器。
  • 一个搜索区域。
  • 一种搜索或优化超参数组合的方法。
  • 一个用于比较各种超参数组合性能的评估函数。

你是否在寻找一个完整的数据科学中使用的Python库。查看这里.

超参数调整的工作原理

超参数优化的目的是在预算的约束下,通过修改超参数获得最佳或接近最佳的模型性能。该函数的数学表述根据所选ML算法的目标函数和性能指标函数而不同。模型的性能可以用各种措施来衡量,包括准确性、RMSE、F1分数和误报率。然而,在现实中,时间预算是改进超参数优化模型的一个重要限制,必须加以考虑。用相当数量的超参数配置使ML模型的目标函数最大化,经常需要很长的时间。

超参数优化的主要过程如下。

  1. 选择一个目标函数和性能指标。
  2. 确定需要调整的超参数,描述其种类,并确定最佳的优化方法。
  3. 作为基线模型,使用默认的超参数设置或常用值训练ML模型。
  4. 开始优化过程,根据人工测试和/或领域专业知识,选择一个广泛的搜索空间作为超参数的可行领域。
  5. 根据目前测试过的表现良好的超参数值的领域缩小搜索空间,或者,如果需要,探索其他的搜索空间。
  6. 作为最终答案,返回表现最佳的超参数配置。

遗传算法是如何用于超参数优化的?

最普遍的元启发式算法之一是遗传算法(GA),它是基于进化论的思想,即具有最高生存潜力和适应环境的人更有可能生存下来并将其素质传给后代。他们父母的品质将被传递给下一代,其中可能包括好人和坏人。更好的人将更有可能活下来,并创造出更多有能力的孩子,而最差的人则会逐渐消逝。具有最强适应性的个体将在多代之后被选为全局最优。

为了将GA用于超参数优化问题,每个染色体或人代表一个超参数,其小数点值反映了超真实参数在每次评估中的输入值。每个染色体都有多个基因,这些基因是二进制数字,这些基因随后被进行交叉和变异活动。群体包含初始化染色体/参数范围内的所有潜在值,而健身函数则是参数评估指标的特征。

由于自发的参数值经常不包括最佳参数值,因此必须对表现良好的染色体进行额外的操作,如选择、交叉和变异,以发现最佳参数。染色体的选择是通过选择具有高健身函数值的染色体进行的。为了保持种群规模不变,具有高健身函数值的染色体更有可能被传递到下一代,在那里它们发展出具有其父母最佳性状的新染色体。

染色体选择确保一代人的有益性状向下传递到后续世代。交叉是一种通过在染色体之间交换一定比例的基因来创造新染色体的方法。突变程序也被用来通过随机修改一个或多个染色体基因来创造新的染色体。交叉和突变过程允许在接下来的几代中出现替代特征,并减少了丢失有益品质的可能性。

实施GA来调整模型

本文建立了一个分类器,可以根据水的不同特征对饮水进行分类。超参数将在TPOT分类器的帮助下进行优化,TPOT是一个基于遗传算法(GA)的机器学习模型。

让我们从安装TPOT开始。

!pip install tpot

导入必要的库

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split,RandomizedSearchCV
from tpot import TPOTClassifier
 
import warnings
warnings.filterwarnings('ignore')

读取数据集

data=pd.read_csv('water_potability.csv')
data_utils=data.dropna(axis=0)
data_utils[:5]

印度分析杂志

X=data_utils.drop('Potability',axis=1)
y=data_utils['Potability']

将数据按标准比例70:30分成训练和测试。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42,shuffle=True)

建立优化器

本文使用随机森林分类器对不同的水样进行标记。所以要定义超参数的优化参数。

n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)]
max_features = ['auto', 'sqrt','log2']
max_depth = [int(x) for x in np.linspace(10, 1000,10)]
min_samples_split = [2, 5, 10,14]
min_samples_leaf = [1, 2, 4,6,8]
param = {'n_estimators': n_estimators,
               'max_features': max_features,
               'max_depth': max_depth,
               'min_samples_split': min_samples_split,
               'min_samples_leaf': min_samples_leaf,
              'criterion':['entropy','gini']}

参数定义后,然后通过定义所需的代数、种群大小、子代大小和需要优化的超参数模型,来建立pot分类器。本文使用评分技术作为准确性。

tpot_classifier = TPOTClassifier(generations= 5, population_size= 24, offspring_size= 12,
                                 verbosity= 2, early_stop= 12,
                                 config_dict={'sklearn.ensemble.RandomForestClassifier': param}, 
                                 cv = 4, scoring = 'accuracy')
tpot_classifier.fit(X_train,y_train)

印度分析杂志

在这篇文章中,代数被设定为5,但从上面的结果来看,3代就足以进行优化了,因为在第3代之后,cv分数在增加。由于GA是一种顺序算法,所以并行处理是一项困难的任务,由于这个原因,计算时间很高。代数的多少与计算时间成正比。

印度分析杂志

分类器的最佳超参数将以这种格式从定义GA时作为分类器参数传递的参数中返回。

accuracy = tpot_classifier.score(X_test, y_test)
print(accuracy)

印度分析杂志

结论

由于它的选择、交叉和变异程序减少了错过全局最优的危险,遗传算法的实现很简单,不需要充分的初始化。遗传算法的基本制约因素是它提供了新的超参数设置,如健身函数类型、种群大小、交叉率和变异率。通过这篇文章,我们已经了解了遗传算法对超参数优化的实现。

参考文献

The postHow to use genetic algorithm for hyperparameter tuning of ML models?appeared first onAnalytics India Magazine.