estimated_y_in_cv = estimated_y_in_cv * y.std() + y.mean()  # スケールをもとに戻す
            r2_in_cv = metrics.r2_score(y, estimated_y_in_cv)  # r2 を計算
            print(component, r2_in_cv)  # 成分数と r2 を表示
            r2_in_cv_all.append(r2_in_cv)  # r2 を追加
            components.append(component)  # 成分数を追加

        # 成分数ごとの CV 後の r2 をプロットし、CV 後のr2が最大のときを最適成分数に
        optimal_component_number = sample_functions.plot_and_selection_of_hyperparameter(components, r2_in_cv_all,
                                                                                         'number of components',
                                                                                         'cross-validated r2')
        print('\nCV で最適化された成分数 :', optimal_component_number)
        # PLS
        model = PLSRegression(n_components=optimal_component_number)  # モデルの宣言
    elif method_name == 'svr':
        # グラム行列の分散を最大化することによる γ の最適化
        optimal_svr_gamma = sample_functions.gamma_optimization_with_variance(autoscaled_x, svr_gammas)
        # CV による ε の最適化
        model_in_cv = GridSearchCV(svm.SVR(kernel='rbf', C=3, gamma=optimal_svr_gamma), {'epsilon': svr_epsilons},
                                   cv=fold_number, iid=False)
        model_in_cv.fit(autoscaled_x, autoscaled_y)
        optimal_svr_epsilon = model_in_cv.best_params_['epsilon']
        # CV による C の最適化
        model_in_cv = GridSearchCV(svm.SVR(kernel='rbf', epsilon=optimal_svr_epsilon, gamma=optimal_svr_gamma),
                                   {'C': svr_cs}, cv=fold_number, iid=False)
        model_in_cv.fit(autoscaled_x, autoscaled_y)
        optimal_svr_c = model_in_cv.best_params_['C']
        # CV による γ の最適化
        model_in_cv = GridSearchCV(svm.SVR(kernel='rbf', epsilon=optimal_svr_epsilon, C=optimal_svr_c),
                                   {'gamma': svr_gammas}, cv=fold_number, iid=False)
        model_in_cv.fit(autoscaled_x, autoscaled_y)
        optimal_svr_gamma = model_in_cv.best_params_['gamma']
import pandas as pd
import sample_functions
from sklearn import svm
import matplotlib.pyplot as plt

ocsvm_nu = 0.003  # OCSVM における ν。トレーニングデータにおけるサンプル数に対する、サポートベクターの数の下限の割合
ocsvm_gammas = 2 ** np.arange(-20, 11, dtype=float)  # γ の候補
x_train = pd.read_csv('tep_0.csv', index_col=0)
x_test = pd.read_csv('tep_7.csv', index_col=0)

# オートスケーリング
autoscaled_x_train = (x_train - x_train.mean()) / x_train.std()
autoscaled_x_test = (x_test - x_test.mean()) / x_test.std()

# グラム行列の分散を最大化することによる γ の最適化
optimal_ocsvm_gamma = sample_functions.gamma_optimization_with_variance(autoscaled_x_train, ocsvm_gammas)
# 最適化された γ
print('最適化された gamma :', optimal_ocsvm_gamma)

# OCSVM による異常検出モデル
model = svm.OneClassSVM(kernel='rbf', gamma=optimal_ocsvm_gamma, nu=ocsvm_nu)
model.fit(autoscaled_x_train)  # モデル構築

# トレーニングデータのデータ密度 (f(x) の値)
data_density_train = model.decision_function(autoscaled_x_train)
number_of_support_vectors = len(model.support_)
number_of_outliers_in_training_data = sum(data_density_train < 0)
print('\nトレーニングデータにおけるサポートベクター数 :', number_of_support_vectors)
print('トレーニングデータにおけるサポートベクターの割合 :', number_of_support_vectors / x_train.shape[0])
print('\nトレーニングデータにおける外れサンプル数 :', number_of_outliers_in_training_data)
print('トレーニングデータにおける外れサンプルの割合 :', number_of_outliers_in_training_data / x_train.shape[0])