遺伝的アルゴリズムの応用

遺伝的アルゴリズムの定義

  • まず、国民の初期人口サイズを設定します。
  • 次に、善玉と悪玉を区別するために使用する関数を定義します。
  • 繰り返しますが、私たちは優秀な人材を選び、彼らに自分の子孫を繁殖させます。
  • 最終的には、これらの子孫が元の住民の一部の悪者に取って代わり、そのプロセスが繰り返されました。

したがって、遺伝的アルゴリズムを正式に定義するには、遺伝的アルゴリズムを、最適な出力値または結果を得ることができる特定の入力を見つけようとする最適化手法と考えることができます。遺伝的アルゴリズムの動作方法も生物学に由来しており、具体的なプロセスは次の図に示されています。
ここに画像の説明を挿入

遺伝的アルゴリズムの具体的な手順

ここに画像の説明を挿入
最初のステップは、母集団を定義することです。集団には個人が含まれており、各個人は独自の染色体のセットを持っています。
ここに画像の説明を挿入
次に、最初の 2 つの染色体の適合度スコアを計算してみましょう。A1 染色体 [100110] については、次のとおりです。
ここに画像の説明を挿入
同様に、A2 染色体 [001110] については、次のようになります。
ここに画像の説明を挿入
この問題については、染色体に含まれる生存スコアが多いほど、その染色体の適応力がより強力であることを意味すると考えられます。

したがって、図から、染色体 1 の適応能力が染色体 2 の適応能力よりも強いことがわかります。

選ぶ

これで、集団から適切な染色体を選択し、それらを互いに「交配」させ、独自の次世代を生み出すことができるようになりました。これが選択操作の一般的な考え方ですが、これにより、数世代後には染色体の違いが少なくなり、多様性が失われます。したがって、通常はルーレットホイール選択方式を実行します。
ルーレットを想像してください。ここで、それを m 個の部分に分割します。ここで、m は集団内の染色体の数を表します。ルーレット上で各染色体が占める面積は、適応度スコアに応じて比例的に表現されます。
ここに画像の説明を挿入
ここで、ルーレットが回転し始め、図内の固定点が指す領域を最初の親として選択します。次に、2 番目の親についても同じことを行います。以下の図に示すように、途中で 2 つの固定ポインターをマークすることもあります。
ここに画像の説明を挿入
このようにして、1 ラウンドで 2 つの親を取得できます。この方法を確率的普遍選択法と呼びます。

クロス

前のステップで、子孫を生み出す親の染色体を選択しました。つまり、生物学の観点から言えば、いわゆる「クロスオーバー」とは実際には生殖を指します。次に、染色体 1 と 4 (前のステップで選択した) を「交叉」しましょう。以下の図を参照してください。
ここに画像の説明を挿入
これは最も基本的な交叉形式であり、「単一点交叉」と呼ばれます。ここでは、交叉点をランダムに選択し、交叉点の前後の染色体部分で染色体間交叉を実行し、新しい子孫を生成します。

2 つの交点を設定する場合、この方法は「多点交点」と呼ばれます。次の図を参照してください。
ここに画像の説明を挿入

突然変異

この質問を生物学的な観点から見てみると、次のように考えられます。上記のプロセスによって生み出された子孫は、親と同じ特徴を持っていますか? 答えはいいえだ。子孫が成長するにつれて、遺伝子に何らかの変化が起こり、親とは異なったものになります。私たちはこのプロセスを「突然変異」と呼びますが、これは染色体上で起こるランダムな変化として定義できます。変異があるため、集団に多様性が存在します。

以下の図は、突然変異の簡単な例を示しています。
ここに画像の説明を挿入ここに画像の説明を挿入
一連の「遺伝的突然変異」の後、適合関数を使用してこれらの新しい子孫を検証し、関数がそれらが十分に適合していると判断した場合、それらは母集団の染色体から次のものに置き換えられます。不十分な適応度は破棄されます。ここで質問ですが、子孫が最適な適応度レベルに達していると判断するには、最終的にどのような基準を使用すればよいでしょうか?

一般に、次のようないくつかの終了条件があります。

1. X 回繰り返した後でも、全体的には大きな変化はありません。
2. アルゴリズムの進化回数をあらかじめ定義しておきます。
3. フィットネス関数が事前定義された値に達したとき。

さて、遺伝的アルゴリズムの本質については基本的に理解できたと思います。それでは、それを使用してデータ サイエンスのシナリオに適用してみましょう。

TPOTライブラリで実装

まず、scikit-learn ライブラリに基づいた TPOT ライブラリ (ツリーベースのパイプライン最適化手法、ツリーベースのパイプライン最適化手法) を簡単に見てみましょう。以下の図は、基本的な転送構造を示しています。
ここに画像の説明を挿入
図の灰色の部分は TPOT ライブラリで自動処理されます。この部分の自動処理には遺伝的アルゴリズムを使用する必要があります。

ここでは詳細には触れませんが、直接適用してください。TPOT ライブラリを使用できるようにするには、まず TPOT が構築されている Python ライブラリをインストールする必要があります。早速インストールしてみましょう。

# installing DEAP, update_checker and tqdm 

pip install deap update_checker tqdm
# installling TPOT 
pip install tpot

ここでは、Big Mart Sales (データセット アドレス: https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/) データセットを使用して実装の準備をしました。早速ダウンロードしてみましょう。およびテスト ファイルの場合、Python コードは次のとおりです。

# import basic libraries

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
%matplotlib inline 
from sklearn import preprocessing 
from sklearn.metrics import mean_squared_error 
## preprocessing 
### mean imputations 

train['Item_Weight'].fillna((train['Item_Weight'].mean()), inplace=True)
test['Item_Weight'].fillna((test['Item_Weight'].mean()), inplace=True) 
### reducing fat content to only two categories 

train['Item_Fat_Content'] = train['Item_Fat_Content'].replace(['low fat','LF'], ['Low Fat','Low Fat']) 
train['Item_Fat_Content'] = train['Item_Fat_Content'].replace(['reg'], ['Regular']) 
test['Item_Fat_Content'] = test['Item_Fat_Content'].replace(['low fat','LF'], ['Low Fat','Low Fat']) 
test['Item_Fat_Content'] = test['Item_Fat_Content'].replace(['reg'], ['Regular']) 
train['Outlet_Establishment_Year'] = 2013 - train['Outlet_Establishment_Year'] 
test['Outlet_Establishment_Year'] = 2013 - test['Outlet_Establishment_Year'] 

train['Outlet_Size'].fillna('Small',inplace=True)
test['Outlet_Size'].fillna('Small',inplace=True)

train['Item_Visibility'] = np.sqrt(train['Item_Visibility'])
test['Item_Visibility'] = np.sqrt(test['Item_Visibility'])

col = ['Outlet_Size','Outlet_Location_Type','Outlet_Type','Item_Fat_Content']
test['Item_Outlet_Sales'] = 0combi = train.append(test)for i in col:
 combi[i] = number.fit_transform(combi[i].astype('str'))
 combi[i] = combi[i].astype('object')
train = combi[:train.shape[0]]
test = combi[train.shape[0]:]
test.drop('Item_Outlet_Sales',axis=1,inplace=True)
## removing id variables 

tpot_train = train.drop(['Outlet_Identifier','Item_Type','Item_Identifier'],axis=1)
tpot_test = test.drop(['Outlet_Identifier','Item_Type','Item_Identifier'],axis=1)
target = tpot_train['Item_Outlet_Sales']
tpot_train.drop('Item_Outlet_Sales',axis=1,inplace=True)
# finally building model using tpot library

from tpot import TPOTRegressor
X_train, X_test, y_train, y_test = train_test_split(tpot_train, target,
 train_size=0.75, test_size=0.25)

tpot = TPOTRegressor(generations=5, population_size=50, verbosity=2)
tpot.fit(X_train, y_train)
print(tpot.score(X_test, y_test))
tpot.export('tpot_boston_pipeline.py')

これらのコードが実行されると、 tpot_exported_pipeline.py によってパス最適化のための Python コードが配置されます。ExtraTreeRegressor がこの問題を最もよく解決することがわかります。

## predicting using tpot optimised pipeline

tpot_pred = tpot.predict(tpot_test)
sub1 = pd.DataFrame(data=tpot_pred)
#sub1.index = np.arange(0, len(test)+1)

sub1 = sub1.rename(columns = {'0':'Item_Outlet_Sales'})
sub1['Item_Identifier'] = test['Item_Identifier']
sub1['Outlet_Identifier'] = test['Outlet_Identifier']
sub1.columns = ['Item_Outlet_Sales','Item_Identifier','Outlet_Identifier']
sub1 = sub1[['Item_Identifier','Outlet_Identifier','Item_Outlet_Sales']]
sub1.to_csv('tpot.csv',index=False)

おすすめ

転載: blog.csdn.net/qq_39599752/article/details/127703524