<jupyter_start><jupyter_text>Matplotlibで日本語が表示できるようにします。  IPAフォントをインストールします。<jupyter_code>!apt-get -y install fonts-ipafont-gothic<jupyter_output><empty_output><jupyter_text>Matplotlibのフォントのキャッシュを再構築します。<jupyter_code>import matplotlib
matplotlib.font_manager._rebuild()<jupyter_output><empty_output><jupyter_text>キャッシュの再構築を有効にするために、ここでランタイムを再起動してください。  以下の中から予測したい項目のコメントをはずしてください。<jupyter_code>target = '売上高'
# target = '営業利益'
# target = '経常利益'
# target = '税引前純利益'<jupyter_output><empty_output><jupyter_text>グリッドサーチをする場合は、以下の変数の値をTrueにしてください。<jupyter_code>use_grid_search = False<jupyter_output><empty_output><jupyter_text>選択した項目に対応するファイルをダウンロードします。<jupyter_code>if   target == '売上高':
    ! wget http://lkzf.info/xbrl/data/2020-04-08/preprocess-uriage.pickle

elif target == '営業利益':
    ! wget http://lkzf.info/xbrl/data/2020-04-08/preprocess-eigyo.pickle

elif target == '経常利益':
    ! wget http://lkzf.info/xbrl/data/2020-04-08/preprocess-keijo.pickle

elif target == '税引前純利益':
    ! wget http://lkzf.info/xbrl/data/2020-04-08/preprocess-jun.pickle<jupyter_output><empty_output><jupyter_text>CatBoostをインストールします。<jupyter_code>! pip install catboost<jupyter_output><empty_output><jupyter_text>必要なライブラリをインポートします。<jupyter_code>import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error

from sklearn.linear_model import Ridge
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor

sns.set(font='IPAGothic')<jupyter_output><empty_output><jupyter_text>データを読み込みます。<jupyter_code>import pickle

if   target == '売上高':
    file_name = 'preprocess-uriage.pickle'
elif target == '営業利益':
    file_name = 'preprocess-eigyo.pickle'
elif target == '経常利益':
    file_name = 'preprocess-keijo.pickle'
elif target == '税引前純利益':
    file_name = 'preprocess-jun.pickle'
else:
    assert False

with open(file_name, 'rb') as f:
    data = pickle.load(f)

df = data['data_frame']
y_column = data['y_column']<jupyter_output><empty_output><jupyter_text>トレーニングデータとテストデータに分けます。<jupyter_code>X_columns = [ x for x in df.columns if x != y_column ]

# トレーニングデータとテストデータに分けます。
X_train, X_test, y_train, y_test = train_test_split(df[X_columns], df[y_column], test_size=0.2, random_state=0)<jupyter_output><empty_output><jupyter_text>モデルを実行します。<jupyter_code>from sklearn.model_selection import GridSearchCV

def run_model(model):
    global y_test, y_pred

    if use_grid_search and type(model) in [ RandomForestRegressor, XGBRegressor, LGBMRegressor, CatBoostRegressor ]:
        # グリッドサーチをする場合

        model = GridSearchCV(model, {'max_depth': [2,4,6], 'n_estimators': [50,100,200]}, verbose=2, n_jobs=-1)

    # トレーニングデータで学習します。
    result = model.fit(X_train, y_train)

    if hasattr(result, 'best_params_'):
        # 最適なパラメータがある場合
        
        print ('best params =', result.best_params_)

    # テストデータで予測します。
    y_pred = model.predict(X_test)

    # 平均二乗誤差を計算します。
    accu1 = mean_squared_error(y_test, y_pred)
    accu2 = mean_squared_error(y_test, [y_test.mean()] * len(y_test) )

    # 平均絶対誤差を計算します。
    accu3 = mean_absolute_error(y_test, y_pred)
    accu4 = mean_absolute_error(y_test, [y_test.mean()] * len(y_test) )

    print('\n平均二乗誤差 : %.4f ( %.4f )  平均絶対誤差 : %.4f ( %.4f )    ※ カッコ内は全予測値を平均値で置き換えた場合\n' % (accu1, accu2, accu3, accu4))    

    if hasattr(model, 'feature_importances_'):
        # 特徴量の重要度がある場合
        
        # 重要度の順にソートします。
        sorted_idx_names = sorted(enumerate(model.feature_importances_), key=lambda x: x[1], reverse=True)

        print('特徴量の重要度')
        for i, (idx, x) in enumerate(sorted_idx_names[:20]):
            print('    %2d %.05f %s' % (i, 100 * x, X_train.columns[idx]))


    # 正解と予測を散布図に表示します。
    sns.jointplot(y_test, y_pred, kind="reg").set_axis_labels('正解', '予測')<jupyter_output><empty_output><jupyter_text>リッジ回帰<jupyter_code>model = Ridge(alpha=.5)
run_model(model)

# 売上高の予測の場合、これくらいになるはず
# 平均二乗誤差 : 0.0645 ( 0.0667 )  平均絶対誤差 : 0.1784 ( 0.1968 )<jupyter_output><empty_output><jupyter_text>サポートベクターマシン<jupyter_code>model = SVR(kernel='rbf')
run_model(model)

# 売上高の予測の場合、これくらいになるはず
# 平均二乗誤差 : 0.0517 ( 0.0667 )  平均絶対誤差 : 0.1670 ( 0.1968 )<jupyter_output><empty_output><jupyter_text>ランダムフォレスト<jupyter_code>model = RandomForestRegressor(max_depth=6, n_estimators=200)
run_model(model)

# 売上高の予測の場合、これくらいになるはず
# 平均二乗誤差 : 0.0510 ( 0.0667 )  平均絶対誤差 : 0.1680 ( 0.1968 )<jupyter_output><empty_output><jupyter_text>XGBoost<jupyter_code>model = XGBRegressor(max_depth=2, n_estimators=200)
run_model(model)

# 売上高の予測の場合、これくらいになるはず
# 平均二乗誤差 : 0.0496 ( 0.0667 )  平均絶対誤差 : 0.1642 ( 0.1968 )<jupyter_output><empty_output><jupyter_text>LightGBM<jupyter_code>model = LGBMRegressor(objective='regression', num_leaves = 31, max_depth=4, n_estimators=50)
run_model(model)

# 売上高の予測の場合、これくらいになるはず
# 平均二乗誤差 : 0.0495 ( 0.0667 )  平均絶対誤差 : 0.1645 ( 0.1968 )<jupyter_output><empty_output><jupyter_text>CatBoost<jupyter_code>model = CatBoostRegressor(max_depth=2, n_estimators=200, verbose=0)
run_model(model)

# 売上高の予測の場合、これくらいになるはず
# 平均二乗誤差 : 0.0500 ( 0.0667 )  平均絶対誤差 : 0.1646 ( 0.1968 )<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12666791956399173, 'fraction_numerical': 0.039090396542003386, 'mean_word_length': 5.694339622641509, 'pattern_counts': {'":': 0, '<': 65, '<?xml version=': 0, '>': 65, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '24043', 'license': 'MIT', 'n_tokens_mistral': 2837, 'n_tokens_neox': 2669, 'n_words': 307, 'path': 'notebook/sklearn.ipynb', 'repo_name': '5laps2go/xbrl-reader', 'size': '5321'}