Platypusに関しては前回、Python 多目的最適化「Platypus」:自作モジュールによる回帰モデルを読む場合 - HK29’s blogで述べた。
本記事では、回帰式を自作モジュールでなくて、シリアライズにより保存した「.joblib」ファイルを読み込んで実行するコードの雛形である。
得られるデータは上記リンク先と同様で次の3つである。
1. 各世代で得られた目的値を説明変数と共にcsvファイルに保存する
2. 複数の目的関数を横軸,縦軸にしてパレート解として可視化
3. 全データを散布図にして可視化
■本プログラム
#!/usr/bin/env python # -*- coding: utf-8 -*- import os, sys import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression ''' from sklearn.svm import SVR from sklearn.ensemble import GradientBoostingRegressor from sklearn.ensemble import RandomForestRegressor from sklearn import neural_network ''' from platypus import NSGAII, Problem, Real, Integer import itertools import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import seaborn as sns from joblib import dump, load regr1 =load('Weight_LinearRegression_none_interaction_ver_model.joblib') regr2 =load('Waist_LinearRegression_none_interaction_ver_model.joblib') regr3 =load('Pulse_LinearRegression_none_interaction_ver_model.joblib') def my_function_from_joblib(vars): Chins = vars[0] # x1 Situps = vars[1] # x2 Jumps = vars[2] # x3 X_np = np.array([[Chins, Situps, Jumps]]) X_df = pd.DataFrame(X_np, columns = ['Chins', 'Situps', 'Jumps']) pred_Y1 = regr1.predict(X_df) pred_Y2 = regr2.predict(X_df) pred_Y3 = regr3.predict(X_df) return [pred_Y1[0], pred_Y2[0], pred_Y3[0]] def main(my_title): problem = Problem(3, 3) # define 3 inputs and 3 objective (and no constraints) problem.directions[:] = [Problem.MAXIMIZE, Problem.MINIMIZE, Problem.MINIMIZE] # Problem.MINIMIZE Chins = Integer(1, 17) # x1 懸垂の回数 Situps = Integer(50, 250) # x2 上体反らしの回数 Jumps = Integer(25, 250) # x3 ジャンプ problem.types[:] = [Chins, Situps, Jumps] problem.function = my_function_from_joblib print(problem.function) algorithm = NSGAII(problem, 200) # 200 is the population size algorithm.run(10000) # evaluation number column_name_list = ['Chins', 'Situps', 'Jumps', 'Weight', 'Waist', 'Pulse'] column_name_list = ','.join(column_name_list) row_list=[] with open(my_title + '.csv', 'w') as f: f.writelines(column_name_list) f.write('\n') for i in range(len(algorithm.result)): row_list.append(Chins.decode(algorithm.result[i].variables[0])) row_list.append(Situps.decode(algorithm.result[i].variables[1])) row_list.append(Jumps.decode(algorithm.result[i].variables[2])) row_list.extend(algorithm.result[i].objectives[:]) print(row_list) row_list_str = ','.join(map(str, row_list)) # リストに対して、文字列変換とカンマを挿入する f.writelines(row_list_str) f.write('\n') row_list=[] df = pd.read_csv(my_title + '.csv') plt.figure() sns.pairplot(df) plt.savefig(my_title + '_Summary.png') plt.close() plt.scatter([s.objectives[0] for s in algorithm.result], [s.objectives[1] for s in algorithm.result], facecolors='none', edgecolors='r') #plt.ylim([0, 1.1]) plt.grid() #plt.xlabel("$f_1(x)$") #plt.ylabel("$f_2(x)$") plt.xlabel("Weight") plt.ylabel("Waist") plt.title(my_title) plt.savefig(my_title + '_f1_f2.png') plt.close() if __name__ == '__main__': # parameter my_title = 'linnerud' # call function main(my_title)
●参考リンク
●関連リンク
以上
<広告>
リンク