기교가 끝나는 순간 예술이 시작된다.

통계 및 인공지능

기호적회귀분석(Symbolic Regression)

cj92 2021. 6. 12. 13:49

현실에 데이터는 고도의 비선형 자료에 해당하며, 문제 해결에 다양한 제약이 존재한다.

전통적인 최적화 알고리즘들은 이러한 알고리즘을 해결하기에 한계가 존재한다고 한다.

따라서 이러한 한계를 극복하기위해 휴리스틱 알고리즘(Heuristic Algorithm)들이 개발되고 있다고 한다.

휴리스틱이란 불충분한 시간이나 정보로 인하여 합리적인 판단을 할 수 없거나,
체계적이면서 합리적인 판단이 굳이 필요하지 않은 상황에서 사람들이 빠르게 사용할 수 있게
보다 용이하게 구성된 간편 추론의 방법이다.

딥러닝도 이에 한 부류에 해당한다.

회귀분석에서도 이러한 휴리스틱 알고리즘이 있는데 기호적 회귀분석이 이에 해당한다고 한다. 

기호적 회귀분석은 데이터에 대해 종속변수와 독립변수간에 관계를 가장 잘 설명할 수 있는 수학적 관계를 모델이 직접 생성하는 기법에 해당한다. 

from statsmodels.tsa.seasonal import seasonal_decompose
import pandas as pd
import numpy as np
import statsmodels.api as sm
import datetime, dateutil
import matplotlib.pyplot as plt
import gplearn as gpl
from gplearn.genetic import SymbolicRegressor 

df = sm.datasets.get_rdataset("AirPassengers").data
df=df.set_index('time')
df.index=pd.date_range(
        pd.to_datetime('1949-01-01'),
        pd.to_datetime('1961-01-01'),
        freq='1M'
    )
    
result = seasonal_decompose(df['value'], model='additive')

df=pd.DataFrame(
    [result.seasonal,result.trend,result.resid]).T
df=df.dropna()

train=df.iloc[:100,:]
test=df.iloc[100:,:]

def _xexp(x):
    a = np.exp(x);
    a[np.abs(a) > 1e+9] = 1e+9
    return a 

xexp = gpl.functions.make_function( function = _xexp , name = 'xexp', arity=1)
function_set = ['add', 'sub','mul','div']

if 'model' in locals(): del model
model = SymbolicRegressor(population_size = 3000, 
                         tournament_size = 5,
                         generations = 25,
                         stopping_criteria = 0.1,
                         function_set = function_set,
                         metric = 'rmse',
                         p_crossover = 0.65,
                         p_subtree_mutation = 0.15,
                         p_hoist_mutation = 0.05, 
                         p_point_mutation = 0.1,
                         verbose = 1,
                         random_state = None,
                         n_jobs = -1) 

model.fit(train,train.apply(sum,1))
pred=model.predict(test)

plt.plot(test.apply(sum,1).values)
plt.plot(pred)

'통계 및 인공지능' 카테고리의 다른 글

[XAI]설명가능한 AI(1/3)  (0) 2021.02.28
[PCA]차원의 축소  (0) 2021.02.28