特徴の選択は、機械学習モデルを構築するプロセスにおける重要なステップです。モデルと達成したいタスクに適した特徴を選択すると、パフォーマンスが向上します。
高次元のデータセットを扱う場合、特徴の選択が特に重要です。これにより、モデルはより速く、より適切に学習できるようになります。目的は、最適な数の特徴と最も意味のある特徴を見つけることです。
この記事では、強化学習戦略による新しい特徴選択を紹介し、実装します。まず、強化学習、特にマルコフ決定プロセスについて説明します。これはデータ サイエンスの分野における非常に新しい手法であり、特に特徴の選択に適しています。次に、その実装と Python ライブラリ (FSRLearning) のインストールと使用方法を紹介します。最後に、簡単な例を使用してこのプロセスを示します。
強化学習 (RL) 手法は、ゲーム解決などの問題を解決するのに非常に効果的です。強化学習の概念はマルコフ決定プロセス (MDP) に基づいています。ここでのポイントは、詳細な定義に入ることではなく、それがどのように機能し、問題にどのように役立つかを一般的に理解することです。 強化学習では、エージェントは環境と対話することで学習します。現在の状態と報酬信号を観察して決定を下し、選択されたアクションに基づいて正または負のフィードバックを受け取ります。エージェントの目標は、さまざまなアクションを試して累積報酬を最大化することです。 強化学習の重要な概念
強化学習の背後にある考え方は、エージェントが未知の環境から開始するというものです。ミッションを完了するための捜索活動。エージェントは、現在の状態と以前に選択したアクションの影響を受けて、いくつかのアクションを選択する傾向が高くなります。新しい状態に到達してアクションが実行されるたびに、エージェントは報酬を受け取ります。特徴の選択のために定義する必要がある主なパラメーターは次のとおりです:
状態、アクション、報酬、アクションの選択方法
まず、データセット内に存在する特徴のサブセットです。たとえば、データセットに 3 つの特徴 (年齢、性別、身長) とラベルがある場合、考えられる状態は次のとおりです:
[] --> Empty set [Age], [Gender], [Height] --> 1-feature set [Age, Gender], [Gender, Height], [Age, Height] --> 2-feature set [Age, Gender, Height] --> All-feature set
ある状態では、特徴の順序は重要ではありません。機能のリストではなく、コレクションを作成します。
アクションに関しては、1 つのサブセットから未探索の機能の任意のサブセットに移動できます。特徴選択問題のアクションは、現在の状態でまだ調査されていない特徴を選択し、それらを次の状態に追加することです。可能なアクションをいくつか示します:
[Age] -> [Age, Gender] [Gender, Height] -> [Age, Gender, Height]
不可能なアクションの例を次に示します:
[Age] -> [Age, Gender, Height] [Age, Gender] -> [Age] [Gender] -> [Gender, Gender]
状態とアクションを定義しましたが、報酬はまだ定義していません。報酬は、状態の品質を評価するために使用される実数です。
特徴選択問題では、考えられる報酬の 1 つは、新しい特徴を追加することで同じモデルの精度メトリクスを向上させることです。報酬の計算方法の例は次のとおりです:
[Age] --> Accuracy = 0.65 [Age, Gender] --> Accuracy = 0.76 Reward(Gender) = 0.76 - 0.65 = 0.11
初めて訪問する州ごとに、一連の特徴を使用して分類子 (モデル) がトレーニングされます。この値は状態と対応する分類子に保存されます。分類子のトレーニングのプロセスは時間と労力がかかるため、トレーニングは 1 回だけ行います。分類器は特徴の順序を考慮しないため、この問題をツリーではなくグラフとして扱うことができます。この例では、モデルの新しい特徴として「性別」を選択した場合の報酬は、現在の状態と次の状態の精度の差です。
上の図では、各特徴が数値にマッピングされています (「年齢」は 1、「性別」は 2、「身長」は 3)。現在の状態から次の状態をどのように選択するか、あるいは環境をどのように探索するか?
10 個の特徴を持つ問題で考えられるすべての特徴セットを探索すると、状態の数は
10! + 2 = 3 628 802
这里的+2是因为考虑一个空状态和一个包含所有可能特征的状态。我们不可能在每个状态下都训练一个模型,这是不可能完成的,而且这只是有10个特征,如果有100个特征那基本上就是无解了。
但是在强化学习方法中,我们不需要在所有的状态下都去训练一个模型,我们要为这个问题确定一些停止条件,比如从当前状态随机选择下一个动作,概率为epsilon(介于0和1之间,通常在0.2左右),否则选择使函数最大化的动作。对于特征选择是每个特征对模型精度带来的奖励的平均值。
这里的贪心算法包含两个步骤:
1、以概率为epsilon,我们在当前状态的可能邻居中随机选择下一个状态
2、选择下一个状态,使添加到当前状态的特征对模型的精度贡献最大。为了减少时间复杂度,可以初始化了一个包含每个特征值的列表。每当选择一个特性时,此列表就会更新。使用以下公式,更新是非常理想的:
AORf:特征“f”带来的奖励的平均值
K: f被选中的次数
V(F):特征集合F的状态值(为了简单描述,本文不详细介绍)
所以我们就找出哪个特征给模型带来了最高的准确性。这就是为什么我们需要浏览不同的状态,在在许多不同的环境中评估模型特征的最全局准确值。
因为目标是最小化算法访问的状态数,所以我们访问的未访问过的状态越少,需要用不同特征集训练的模型数量就越少。因为从时间和计算能力的角度来看,训练模型以获得精度是最昂贵方法,我们要尽量减少训练的次数。
最后在任何情况下,算法都会停止在最终状态(包含所有特征的集合)而我们希望避免达到这种状态,因为用它来训练模型是最昂贵的。
上面就是我们针对于特征选择的强化学习描述,下面我们将详细介绍在python中的实现。
有一个python库可以让我们直接解决这个问题。但是首先我们先准备数据
我们直接使用UCI机器学习库中的数据:
#Get the pandas DataFrame from the csv file (15 features, 690 rows) australian_data = pd.read_csv('australian_data.csv', header=None) #DataFrame with the features X = australian_data.drop(14, axis=1) #DataFrame with the labels y = australian_data[14]
然后安装我们用到的库
pip install FSRLearning
直接导入
from FSRLearning import Feature_Selector_RL
Feature_Selector_RL类就可以创建一个特性选择器。我们需要以下的参数
feature_number (integer): DataFrame X中的特性数量
feature_structure (dictionary):用于图实现的字典
eps (float [0;1]):随机选择下一状态的概率,0为贪婪算法,1为随机算法
alpha (float [0;1]):控制更新速率,0表示不更新状态,1表示经常更新状态
gamma (float[0,1]):下一状态观察的调节因子,0为近视行为状态,1为远视行为
nb_iter (int):遍历图的序列数
starting_state (" empty "或" random "):如果" empty ",则算法从空状态开始,如果" random ",则算法从图中的随机状态开始
所有参数都可以机型调节,但对于大多数问题来说,迭代大约100次就可以了,而epsilon值在0.2左右通常就足够了。起始状态对于更有效地浏览图形很有用,但它非常依赖于数据集,两个值都可以测试。
我们可以用下面的代码简单地初始化选择器:
fsrl_obj = Feature_Selector_RL(feature_number=14, nb_iter=100)
与大多数ML库相同,训练算法非常简单:
results = fsrl_obj.fit_predict(X, y)
下面是输出的一个例子:
输出是一个5元组,如下所示:
DataFrame X中特性的索引(类似于映射)
特征被观察的次数
所有迭代后特征带来的奖励的平均值
从最不重要到最重要的特征排序(这里2是最不重要的特征,7是最重要的特征)
全局访问的状态数
还可以与Scikit-Learn的RFE选择器进行比较。它将X, y和选择器的结果作为输入。
fsrl_obj.compare_with_benchmark(X, y, results)
输出是在RFE和FSRLearning的全局度量的每一步选择之后的结果。它还输出模型精度的可视化比较,其中x轴表示所选特征的数量,y轴表示精度。两条水平线是每种方法的准确度中值。
Average benchmark accuracy : 0.854251012145749, rl accuracy : 0.8674089068825909 Median benchmark accuracy : 0.8552631578947368, rl accuracy : 0.868421052631579 Probability to get a set of variable with a better metric than RFE : 1.0 Area between the two curves : 0.17105263157894512
可以看到RL方法总是为模型提供比RFE更好的特征集。
另一个有趣的方法是get_plot_ratio_exploration。它绘制了一个图,比较一个精确迭代序列中已经访问节点和访问节点的数量。
由于设置了停止条件,算法的时间复杂度呈指数级降低。即使特征的数量很大,收敛性也会很快被发现。下面的图表示一定大小的集合被访问的次数。
在所有迭代中,算法访问包含6个或更少变量的状态。在6个变量之外,我们可以看到达到的状态数量正在减少。这是一个很好的行为,因为用小的特征集训练模型比用大的特征集训练模型要快。
我们可以看到RL方法对于最大化模型的度量是非常有效的。它总是很快地收敛到一个有趣的特性子集。该方法在使用FSRLearning库的ML项目中非常容易和快速地实现。
以上が強化学習戦略による特徴選択の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。