#!/usr/bin/env python
# coding: utf-8
# In[1]:
from datetime import datetime
print(f'Päivitetty {datetime.now()}')
#
Esimerkki sopivien hyperparametrien etsimisestä
#
# Mallille annettavia parametreja on tapana kutsua hyperparametreiksi.
#
# Testidatan käyttö sopivien hyperparametrien valitsemissa ei ole suotavaa, koska tällöin testidata olisi osittain osallisena mallin opettamiseen. Testidatanhan on tarkoitus olla data, jota malli ei ole "nähnyt" opetuksen yhteydessä.
#
# Hyperparametrien valitsemisessa voidaan käyttää **GridSearchCV**-toimintoa, joka jakaa opetusdatan opetusdataan ja validointidataan sekä kokeilee vaihtoehtoisia hyperparametrien arvoja. Lue lisää:
#
# https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
# In[2]:
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
# In[3]:
df = sns.load_dataset('iris')
X = df.drop('species', axis=1)
y = df['species']
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2)
# In[4]:
# Määritän käytettävän mallin
dtc = DecisionTreeClassifier(random_state=2)
# Katson mallin oletushyperparametrit
dtc.get_params()
# In[5]:
# Kokeilen erilaisia päätöspuun haarautumisten lukumääriä
parameters = {'max_depth':[1, 2, 3]}
# GridSearchCV kokeilee kaikki vaihtoehdot ja valitsee parhaan
dtc_grid = GridSearchCV(dtc, parameters, verbose=3)
dtc_grid.fit(X_train, y_train)
# In[6]:
# Katsotaan paras tulos
print('best score: ', dtc_grid.best_score_)
print('best parameters: ', dtc_grid.best_params_)
# Käytetään parhaiksi todettuja hyperparametrien arvoja
dtc = dtc_grid.best_estimator_
# In[7]:
print(f'Opetusdata {dtc.score(X_train, y_train):.3f}')
print(f'Testidata {dtc.score(X_test, y_test):.3f}')
# ## Satunnaismetsä
# In[8]:
# Määritän käytettävän mallin
rfc = RandomForestClassifier(random_state=2)
# Katson mallin oletushyperparametrit
rfc.get_params()
# In[9]:
# Keskeisimmät parametrit ovat laskettavien päätöspuiden lukumäärä
# ja yhteen päätöspuuhun mukaan otettavien selittävien muuttujien lukumäärä
parameters = {'n_estimators':[100, 200, 300],
'max_features':[2, 3, 4]}
# Kokeilen kaikki vaihtoehdot
rfc_grid = GridSearchCV(rfc, parameters, verbose=3)
rfc_grid.fit(X_train, y_train)
# In[10]:
# Katsotaan paras tulos
print('best score: ', rfc_grid.best_score_)
print('best parameters: ', rfc_grid.best_params_)
# Käytetään parhaiksi todettuja hyperparametrien arvoja
rfc = rfc_grid.best_estimator_
# In[11]:
print(f'Opetusdata {rfc.score(X_train, y_train):.3f}')
print(f'Testidata {rfc.score(X_test, y_test):.3f}')
# ## Gradienttitehostaminen
# In[12]:
gbc = GradientBoostingClassifier(random_state=2)
gbc.get_params()
# In[13]:
# Gradienttitehostuksella myös learning_rate on keskeinen parametri
# Liian pieni learning_rate johtaa hitaaseen oppimiseen
# liian suuri learning_rate voi estää optimiratkaisun löytymisen
parameters = {'max_depth':[1, 2, 3],
'n_estimators':[100, 200, 300, 400],
'learning_rate':[0.001, 0.01, 0.1]}
gbc_grid = GridSearchCV(gbc, parameters, verbose=3)
gbc_grid.fit(X_train, y_train)
# In[14]:
print('best score: ', gbc_grid.best_score_)
print('best parameters: ', gbc_grid.best_params_)
# Käytetään parhaiksi todettuja hyperparametrien arvoja
gbc = gbc_grid.best_estimator_
# In[15]:
print(f'Opetusdata {gbc.score(X_train, y_train):.3f}')
print(f'Testidata {gbc.score(X_test, y_test):.3f}')