#!/usr/bin/env python # coding: utf-8 # # Regressio - eri mallien kokeilua # # Lineaarisen regression ohella on tarjolla monia regressiomalleja, jotka sopivat myös ei-lineaaristen riippuvuuksien mallintamiseen. # # Seuraavassa käytän kahta ensemble-mallia (ensemble-malli = yhdistelmä useista malleista): # # * Satunnaismetsä-regressio (RandomForestRegressor); satunnaismetsä, soveltuu erityisesti ylimallintamisen välttämiseen # * Gradienttitehostus-regressio (GradientBoostingRegressor); antaa usein muita menetelmiä tarkempia ennusteita # In[1]: from datetime import datetime print(f'Päivitetty {datetime.now()}') # In[2]: import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # train_test_split osaa jakaa datan opetusdataan ja testidataan from sklearn.model_selection import train_test_split # Käytettävät mallit from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor # Seuraava komento kannattaa tässä antaa varmuuden vuoksi # Ilman tätä joissain versioissa kuviot eivät tulostu näkyville get_ipython().run_line_magic('matplotlib', 'inline') # ## Funktio mallin sovittamiseen ja tarkasteluun # # Jos samaa koodia käytetään toistuvasti, niin siitä kannattaa tehdä funktio. # In[3]: def mallinna(malli): # Mallin sovitus opetusdataan malli.fit(X_train, y_train) # Selityskerroin opetusdatalle y_pred_train = malli.predict(X_train) R2_train_malli = malli.score(X_train, y_train) # Selityskerroin testidatalle y_pred_test = malli.predict(X_test) R2_test_malli = malli.score(X_test, y_test) # Selityskertoimien tulostus print(f'Opetusdatan selityskerroin {R2_train_malli:.3f}') print(f'Testidatan selityskerroin {R2_test_malli:.3f}') # Opetusdatan virhetermit kaaviona fig, ax = plt.subplots(1, 2, figsize=(10, 4)) ax[0].set_title('Ennustevirheiden jakauma opetusdatassa') sns.histplot((y_train-y_pred_train), kde=True, ax=ax[0]) ax[0].set_xlabel('y_train - y_pred_train') # toteutuneet ja ennustetut hajontakaaviona testidatalle ax[1].set_title('Toteutuneet ja ennustetut testidatassa') ax[1].scatter(x=y_test, y=y_pred_test) ax[1].set_xlabel('toteutunut') ax[1].set_ylabel('ennuste') # ## Datan tarkastelua # In[4]: df = pd.read_csv('https://taanila.fi/Advertising.csv') df.info() # In[5]: df # In[6]: # Poistetaan tarpeeton järjestysnumero-sarake df = df.drop('Unnamed: 0', axis = 1) df # In[7]: df.describe() # In[8]: # Riippuvuuksien tarkastelua hajontakaavioina sns.pairplot(df, kind = 'reg') # In[9]: # Riippuvuuksien tarkastelua korrelaatiokertoimien avulla correlation_matrix = df.corr().round(2) sns.heatmap(data=correlation_matrix, annot=True) # ## Mallien sovittaminen # In[10]: # Selittävät muuttujat X = df[['TV', 'radio', 'newspaper']] # Kohdemuuttuja y = df['sales'] # In[11]: # Jako opetus- ja testidataan X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2) # ### Lineaarinen regressio # In[12]: malli = LinearRegression() # Tässä hyödynnän aiemmin määriteltyä mallinna-funktiota mallinna(malli) # ### Satunnaismetsä # In[13]: malli = RandomForestRegressor() mallinna(malli) # ### Gradienttitehostus # In[14]: malli = GradientBoostingRegressor() mallinna(malli)