Python 多目的最適化「Platypus」シリアル化した回帰モデルを読む場合

 Platypusに関しては前回、Python 多目的最適化「Platypus」:自作モジュールによる回帰モデルを読む場合 - HK29’s blogで述べた。

本記事では、回帰式を自作モジュールでなくて、シリアライズにより保存した「.joblib」ファイルを読み込んで実行するコードの雛形である。

得られるデータは上記リンク先と同様で次の3つである。

1. 各世代で得られた目的値を説明変数と共にcsvファイルに保存する

f:id:HK29:20191222202812p:plain

2. 複数の目的関数を横軸,縦軸にしてパレート解として可視化

f:id:HK29:20191222202302p:plain

3. 全データを散布図にして可視化

f:id:HK29:20191222202338p:plain

■本プログラム

#!/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)
    

●参考リンク

GitHub - Project-Platypus/Platypus: A Free and Open Source Python Library for Multiobjective Optimization

●関連リンク

hk29.hatenablog.jp

hk29.hatenablog.jp

以上

<広告>