機械学習 最適なアルゴリズムとパラメーターを見つける

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.utils import all_estimators
import warnings

# あやめデータの読み込み read_csv()メソッドで読み込み
iris_data = pd.read_csv("iris.csv", encoding="utf-8")

# あやめデータをラベルと入力データに分離する loc()メソッドでヘッダー項目で分離
y = iris_data.loc[:, "Name"]
x = iris_data.loc[:,["SepalLength","SepalWidth","PetalLength","PetalWidth"]]

# 学習用とテスト用に分離する train_test_split()メソッドで分離
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8, shuffle=True)

# classifierのアルゴリズムをすべて取得する
allAlgorithms = all_estimators(type_filter="classifier")
warnings.simplefilter("error")

for (name, algorithm) in allAlgorithms:
    try:
        # 各アルゴリズムのオブジェクトを作成
        clf = algorithm()
        
        # 学習して、評価する
        clf.fit(x_train, y_train)
        y_pred = clf.predict(x_test)
        print(name, "の正解率 =", accuracy_score(y_test, y_pred))
        
    # WarningやExceptionの内容を表示する
    except Warning as w:
        print("\033[33m"+"Warning:"+"\033[0m", name, ":", w.args)
    except Exception as e:
        print("\033[31m"+"Error:"+"\033[0m", name, ":", e.args)
AdaBoostClassifier の正解率 = 0.8666666666666667
BaggingClassifier の正解率 = 0.9666666666666667
BernoulliNB の正解率 = 0.23333333333333334
Warning: CalibratedClassifierCV : ('Liblinear failed to converge, increase the number of iterations.',)
CategoricalNB の正解率 = 0.8666666666666667
Error: ClassifierChain : ("__init__() missing 1 required positional argument: 'base_estimator'",)
ComplementNB の正解率 = 0.7
DecisionTreeClassifier の正解率 = 0.9
DummyClassifier の正解率 = 0.23333333333333334
ExtraTreeClassifier の正解率 = 0.9
ExtraTreesClassifier の正解率 = 0.9333333333333333
GaussianNB の正解率 = 0.9333333333333333
GaussianProcessClassifier の正解率 = 0.8666666666666667
GradientBoostingClassifier の正解率 = 0.9
HistGradientBoostingClassifier の正解率 = 0.8666666666666667
KNeighborsClassifier の正解率 = 0.9333333333333333
LabelPropagation の正解率 = 0.9333333333333333
LabelSpreading の正解率 = 0.9333333333333333
LinearDiscriminantAnalysis の正解率 = 1.0
Warning: LinearSVC : ('Liblinear failed to converge, increase the number of iterations.',)
Warning: LogisticRegression : ('lbfgs failed to converge (status=1):\nSTOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n\nIncrease the number of iterations (max_iter) or scale the data as shown in:\n    https://scikit-learn.org/stable/modules/preprocessing.html\nPlease also refer to the documentation for alternative solver options:\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression',)
Warning: LogisticRegressionCV : ('lbfgs failed to converge (status=1):\nSTOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n\nIncrease the number of iterations (max_iter) or scale the data as shown in:\n    https://scikit-learn.org/stable/modules/preprocessing.html\nPlease also refer to the documentation for alternative solver options:\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression',)
Warning: MLPClassifier : ("Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.",)
Error: MultiOutputClassifier : ("__init__() missing 1 required positional argument: 'estimator'",)
MultinomialNB の正解率 = 0.6333333333333333
NearestCentroid の正解率 = 0.8666666666666667
NuSVC の正解率 = 0.8666666666666667
Error: OneVsOneClassifier : ("__init__() missing 1 required positional argument: 'estimator'",)
Error: OneVsRestClassifier : ("__init__() missing 1 required positional argument: 'estimator'",)
Error: OutputCodeClassifier : ("__init__() missing 1 required positional argument: 'estimator'",)
PassiveAggressiveClassifier の正解率 = 0.7666666666666667
Perceptron の正解率 = 0.5
QuadraticDiscriminantAnalysis の正解率 = 1.0
RadiusNeighborsClassifier の正解率 = 0.8666666666666667
RandomForestClassifier の正解率 = 0.9
RidgeClassifier の正解率 = 0.8666666666666667
RidgeClassifierCV の正解率 = 0.8666666666666667
SGDClassifier の正解率 = 0.8333333333333334
SVC の正解率 = 0.8666666666666667
Error: StackingClassifier : ("__init__() missing 1 required positional argument: 'estimators'",)
Error: VotingClassifier : ("__init__() missing 1 required positional argument: 'estimators'",)
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.utils import all_estimators
import warnings


# あやめデータの読み込み read_csv()メソッドで読み込み
iris_data = pd.read_csv("iris.csv", encoding="utf-8")


# あやめデータをラベルと入力データに分離する loc()メソッドでヘッダー項目で分離
y = iris_data.loc[:, "Name"]
x = iris_data.loc[:,["SepalLength","SepalWidth","PetalLength","PetalWidth"]]


# 学習用とテスト用に分離する train_test_split()メソッドで分離
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8, shuffle=True)


# classifierのアルゴリズムをすべて取得する
allAlgorithms = all_estimators(type_filter="classifier")
warnings.simplefilter("error")

for (name, algorithm) in allAlgorithms:
    try:
        # 各アルゴリズムのオブジェクトを作成
        if (name == "LinearSVC") :
            clf = algorithm(max_iter = 10000)
        else:
            clf = algorithm()
        
        # 学習して、評価する
        clf.fit(x_train, y_train)
        y_pred = clf.predict(x_test)
        print(name, "の正解率 =", accuracy_score(y_test, y_pred))
        
    # WarningやExceptionの内容を表示する
    except Warning as w:
        print("\033[33m"+"Warning:"+"\033[0m", name, ":", w.args)
    except Exception as e:
        print("\033[31m"+"Error:"+"\033[0m", name, ":", e.args)
AdaBoostClassifier の正解率 = 0.9333333333333333
BaggingClassifier の正解率 = 0.9666666666666667
BernoulliNB の正解率 = 0.23333333333333334
Warning: CalibratedClassifierCV : ('Liblinear failed to converge, increase the number of iterations.',)
CategoricalNB の正解率 = 0.9
Error: ClassifierChain : ("__init__() missing 1 required positional argument: 'base_estimator'",)
ComplementNB の正解率 = 0.7666666666666667
DecisionTreeClassifier の正解率 = 0.9666666666666667
DummyClassifier の正解率 = 0.23333333333333334
ExtraTreeClassifier の正解率 = 0.8666666666666667
ExtraTreesClassifier の正解率 = 0.9666666666666667
GaussianNB の正解率 = 0.9666666666666667
GaussianProcessClassifier の正解率 = 0.9
GradientBoostingClassifier の正解率 = 0.9333333333333333
HistGradientBoostingClassifier の正解率 = 0.9333333333333333
KNeighborsClassifier の正解率 = 0.9333333333333333
LabelPropagation の正解率 = 0.9666666666666667
LabelSpreading の正解率 = 0.9666666666666667
LinearDiscriminantAnalysis の正解率 = 0.9666666666666667
LinearSVC の正解率 = 0.9333333333333333
LogisticRegression の正解率 = 0.9333333333333333
Warning: LogisticRegressionCV : ('lbfgs failed to converge (status=1):\nSTOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n\nIncrease the number of iterations (max_iter) or scale the data as shown in:\n    https://scikit-learn.org/stable/modules/preprocessing.html\nPlease also refer to the documentation for alternative solver options:\n    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression',)
Warning: MLPClassifier : ("Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.",)
Error: MultiOutputClassifier : ("__init__() missing 1 required positional argument: 'estimator'",)
MultinomialNB の正解率 = 0.5666666666666667
NearestCentroid の正解率 = 0.9333333333333333
NuSVC の正解率 = 0.9333333333333333
Error: OneVsOneClassifier : ("__init__() missing 1 required positional argument: 'estimator'",)
Error: OneVsRestClassifier : ("__init__() missing 1 required positional argument: 'estimator'",)
Error: OutputCodeClassifier : ("__init__() missing 1 required positional argument: 'estimator'",)
PassiveAggressiveClassifier の正解率 = 0.6333333333333333
Perceptron の正解率 = 0.7666666666666667
QuadraticDiscriminantAnalysis の正解率 = 0.9666666666666667
RadiusNeighborsClassifier の正解率 = 0.9
RandomForestClassifier の正解率 = 0.9666666666666667
RidgeClassifier の正解率 = 0.9
RidgeClassifierCV の正解率 = 0.9
SGDClassifier の正解率 = 0.6333333333333333
SVC の正解率 = 0.9333333333333333
Error: StackingClassifier : ("__init__() missing 1 required positional argument: 'estimators'",)
Error: VotingClassifier : ("__init__() missing 1 required positional argument: 'estimators'",)

ワーニングとエラーに対応

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.utils import all_estimators
import warnings
from sklearn.exceptions import ConvergenceWarning

# ConvergenceWarningのみを表示するように設定
warnings.simplefilter("ignore", category=Warning)
warnings.simplefilter("always", category=ConvergenceWarning)

# あやめデータの読み込み
iris_data = pd.read_csv("iris.csv", encoding="utf-8")

# ラベルと入力データに分離
y = iris_data.loc[:, "Name"]
x = iris_data.loc[:, ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]]

# 学習用とテスト用に分離
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8, shuffle=True)

# classifierアルゴリズムのリストを取得
allAlgorithms = all_estimators(type_filter="classifier")

for (name, Algorithm) in allAlgorithms:
    # 特定のアルゴリズムをスキップ
    if name in ["ClassifierChain", "MultiOutputClassifier", "OneVsOneClassifier", "OneVsRestClassifier", "OutputCodeClassifier", "StackingClassifier", "VotingClassifier"]:
        continue

    clf = None
    # アルゴリズムによってパラメータを設定
    if name == "LinearSVC":
        clf = Algorithm(max_iter=10000)
    elif name == "LogisticRegressionCV" or name == "MLPClassifier":
        clf = Algorithm(max_iter=1000)
    else:
        clf = Algorithm()

    try:
        # 学習して、評価する
        clf.fit(x_train, y_train)
        y_pred = clf.predict(x_test)
        print(name, "の正解率 =", accuracy_score(y_test, y_pred))
    except Exception as e:
        print("\033[31m"+"Error:"+"\033[0m", name, ":", e)
daBoostClassifier の正解率 = 0.9666666666666667
BaggingClassifier の正解率 = 0.9666666666666667
BernoulliNB の正解率 = 0.16666666666666666
CalibratedClassifierCV の正解率 = 0.9
CategoricalNB の正解率 = 0.9666666666666667
ComplementNB の正解率 = 0.5
DecisionTreeClassifier の正解率 = 0.9666666666666667
DummyClassifier の正解率 = 0.16666666666666666
ExtraTreeClassifier の正解率 = 0.8666666666666667
ExtraTreesClassifier の正解率 = 0.9666666666666667
GaussianNB の正解率 = 0.9666666666666667
/home/ten/anaconda3/lib/python3.9/site-packages/sklearn/svm/_base.py:1206: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  warnings.warn(
/home/ten/anaconda3/lib/python3.9/site-packages/sklearn/svm/_base.py:1206: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  warnings.warn(
/home/ten/anaconda3/lib/python3.9/site-packages/sklearn/svm/_base.py:1206: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  warnings.warn(
/home/ten/anaconda3/lib/python3.9/site-packages/sklearn/svm/_base.py:1206: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  warnings.warn(
/home/ten/anaconda3/lib/python3.9/site-packages/sklearn/svm/_base.py:1206: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  warnings.warn(
GaussianProcessClassifier の正解率 = 0.9666666666666667
GradientBoostingClassifier の正解率 = 0.9666666666666667
HistGradientBoostingClassifier の正解率 = 0.9666666666666667
KNeighborsClassifier の正解率 = 0.9666666666666667
LabelPropagation の正解率 = 0.9666666666666667
LabelSpreading の正解率 = 0.9666666666666667
LinearDiscriminantAnalysis の正解率 = 1.0
LinearSVC の正解率 = 0.9333333333333333
LogisticRegression の正解率 = 0.9666666666666667
/home/ten/anaconda3/lib/python3.9/site-packages/sklearn/linear_model/_logistic.py:814: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
LogisticRegressionCV の正解率 = 1.0
MLPClassifier の正解率 = 1.0
MultinomialNB の正解率 = 0.6
NearestCentroid の正解率 = 0.9333333333333333
NuSVC の正解率 = 0.9666666666666667
PassiveAggressiveClassifier の正解率 = 0.9333333333333333
Perceptron の正解率 = 0.6666666666666666
QuadraticDiscriminantAnalysis の正解率 = 1.0
RadiusNeighborsClassifier の正解率 = 0.9666666666666667
RandomForestClassifier の正解率 = 0.9666666666666667
RidgeClassifier の正解率 = 0.8333333333333334
RidgeClassifierCV の正解率 = 0.8333333333333334
SGDClassifier の正解率 = 1.0
SVC の正解率 = 0.9666666666666667

クロスバリデーション(テストと評価データを分割して、複数回行い評価)

import pandas as pd
# from sklearn.model_selection import train_test_split
#from sklearn.metrics import accuracy_score
from sklearn.utils import all_estimators
import warnings
from sklearn.exceptions import ConvergenceWarning
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score


# ConvergenceWarningのみを表示するように設定
warnings.simplefilter("ignore", category=Warning)
warnings.simplefilter("always", category=ConvergenceWarning)

# あやめデータの読み込み
iris_data = pd.read_csv("iris.csv", encoding="utf-8")

# ラベルと入力データに分離
y = iris_data.loc[:, "Name"]
x = iris_data.loc[:, ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]]

# 学習用とテスト用に分離
# x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8, shuffle=True)

# K分割クロスバリデーション用オブジェクト
kfold_cv =  KFold(n_splits=5, shuffle=True)
warnings.filterwarnings('ignore')

# classifierアルゴリズムのリストを取得
allAlgorithms = all_estimators(type_filter="classifier")

for (name, Algorithm) in allAlgorithms:
    try:
        # 特定のアルゴリズムをスキップ
        if name in ["ClassifierChain", "MultiOutputClassifier", "OneVsOneClassifier", "OneVsRestClassifier", "OutputCodeClassifier", "StackingClassifier", "VotingClassifier"]:
            continue

        clf = None
        # アルゴリズムによってパラメータを設定
        if name == "LinearSVC":
            clf = Algorithm(max_iter=10000)
        elif name == "LogisticRegressionCV" or name == "MLPClassifier":
            clf = Algorithm(max_iter=1000)
        else:
            clf = Algorithm()

        
        # scoreメソッドを持つクラスを対象とする
        if hasattr(clf, "score"):
            #クロスバリデーションを行う
            scores = cross_val_score(clf, x, y, cv=kfold_cv)
            print(name, "の正解率=")
            print(scores)

    #Exceptionは無視する
    except Exception as e:
        pass

#     try:
#         # 学習して、評価する
#         clf.fit(x_train, y_train)
#         y_pred = clf.predict(x_test)
#         print(name, "の正解率 =", accuracy_score(y_test, y_pred))
#     except Exception as e:
#         print("\033[31m"+"Error:"+"\033[0m", name, ":", e)
AdaBoostClassifier の正解率=
[0.9        0.93333333 0.9        0.96666667 0.9       ]
BaggingClassifier の正解率=
[0.93333333 0.9        1.         0.93333333 0.96666667]
BernoulliNB の正解率=
[0.2        0.2        0.26666667 0.26666667 0.16666667]
CalibratedClassifierCV の正解率=
[0.8        1.         0.93333333 0.93333333 0.66666667]
CategoricalNB の正解率=
[0.96666667 0.96666667 0.96666667 0.93333333 0.83333333]
ComplementNB の正解率=
[0.6        0.73333333 0.73333333 0.7        0.56666667]
DecisionTreeClassifier の正解率=
[0.96666667 1.         0.93333333 0.96666667 0.9       ]
DummyClassifier の正解率=
[0.3        0.16666667 0.2        0.23333333 0.2       ]
ExtraTreeClassifier の正解率=
[0.93333333 0.83333333 0.93333333 0.96666667 0.96666667]
ExtraTreesClassifier の正解率=
[1.         0.96666667 0.96666667 0.83333333 1.        ]
GaussianNB の正解率=
[0.93333333 0.96666667 0.9        1.         0.93333333]
GaussianProcessClassifier の正解率=
[0.93333333 1.         0.93333333 1.         0.9       ]
GradientBoostingClassifier の正解率=
[0.9        0.96666667 0.96666667 0.96666667 0.96666667]
HistGradientBoostingClassifier の正解率=
[1.         0.86666667 0.93333333 0.93333333 0.96666667]
KNeighborsClassifier の正解率=
[1.         0.96666667 0.96666667 1.         0.96666667]
LabelPropagation の正解率=
[1.         1.         0.93333333 0.93333333 0.9       ]
LabelSpreading の正解率=
[0.93333333 0.93333333 0.93333333 1.         1.        ]
LinearDiscriminantAnalysis の正解率=
[1.         1.         0.96666667 0.96666667 0.96666667]
LinearSVC の正解率=
[0.96666667 0.93333333 1.         0.96666667 0.9       ]
LogisticRegression の正解率=
[1.         0.96666667 0.93333333 1.         0.93333333]
LogisticRegressionCV の正解率=
[0.96666667 0.9        0.93333333 0.96666667 1.        ]
MLPClassifier の正解率=
[0.96666667 1.         0.96666667 0.96666667 1.        ]
MultinomialNB の正解率=
[0.9        0.8        0.96666667 0.86666667 0.83333333]
NearestCentroid の正解率=
[0.93333333 0.86666667 1.         0.93333333 0.96666667]
NuSVC の正解率=
[0.96666667 1.         0.96666667 0.9        0.96666667]
PassiveAggressiveClassifier の正解率=
[0.96666667 0.86666667 0.86666667 0.93333333 0.7       ]
Perceptron の正解率=
[0.66666667 0.9        0.46666667 0.73333333 0.8       ]
QuadraticDiscriminantAnalysis の正解率=
[1.         1.         1.         0.93333333 0.96666667]
RadiusNeighborsClassifier の正解率=
[0.93333333 0.96666667 0.93333333 0.93333333 0.96666667]
RandomForestClassifier の正解率=
[0.9        0.96666667 0.93333333 1.         0.96666667]
RidgeClassifier の正解率=
[0.86666667 0.96666667 0.8        0.83333333 0.8       ]
RidgeClassifierCV の正解率=
[0.83333333 0.76666667 0.86666667 0.7        0.96666667]
SGDClassifier の正解率=
[0.63333333 1.         0.8        0.63333333 0.73333333]
SVC の正解率=
[0.96666667 1.         0.93333333 0.96666667 0.96666667]

最適なパラーメーターを見つける方法

GridSearchCVを使う

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
from sklearn.model_selection import GridSearchCV

#あやめデータの読み込み
iris_data = pd.read_csv("iris.csv", encoding="utf-8")

#あやめデータをラベルと入力データに分離する
y = iris_data.loc[:, "Name"]
x = iris_data.loc[:,["SepalLength","SepalWidth","PetalLength","PetalWidth"]]

#学習用とテスト用に分離する
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size= 0.2, train_size = 0.8, shuffle = True)

#グリッドサーch9伊で利用するパラメーターを指定
parameters = [
    {"C": [1, 10, 100, 1000], "kernel":["linear"]},
    {"C": [1, 10, 100, 1000], "kernel":["rbf"], "gamma":[0.001, 0.0001]},
    {"C": [1, 10, 100, 1000], "kernel":["sigmoid"], "gamma":[0.001, 0.0001]}
]

#グリッドサーチを行う
kfold_cv = KFold(n_splits=5, shuffle=True)
clf = GridSearchCV( SVC(), parameters, cv=kfold_cv)
clf.fit(x_train, y_train)
print("最適なパラメーター = ", clf.best_estimator_)

#最適なパラメーターで評価
y_pred = clf.predict(x_test)
print("評価時の正解率 = ", accuracy_score(y_test, y_pred))
最適なパラメーター =  SVC(C=1, kernel='linear')
評価時の正解率 =  1.0

RandomizedSearchCVの例

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV

# アヤメデータの読み込み
iris_data = pd.read_csv("iris.csv", encoding="utf-8")

# アヤメデータをラベルと入力データに分離する
y = iris_data.loc[:,"Name"]
x = iris_data.loc[:,["SepalLength","SepalWidth","PetalLength","PetalWidth"]]

# 学習用とテスト用に分離する 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, train_size = 0.8, shuffle = True)

# グリッドサーチで利用するパラメータを指定 --- (*1)
parameters = [
    {"C": [1, 10, 100, 1000], "kernel":["linear"]},
    {"C": [1, 10, 100, 1000], "kernel":["rbf"], "gamma":[0.001, 0.0001]},
    {"C": [1, 10, 100, 1000], "kernel":["sigmoid"], "gamma": [0.001, 0.0001]}
]

# グリッドサーチを行う --- (*2)
kfold_cv = KFold(n_splits=5, shuffle=True)
clf = RandomizedSearchCV( SVC(), parameters, cv=kfold_cv)
clf.fit(x_train, y_train)
print("最適なパラメータ = ", clf.best_estimator_)

# 最適なパラメータで評価 --- (*3)
y_pred = clf.predict(x_test)
print("評価時の正解率 = " , accuracy_score(y_test, y_pred))

実際は2つを実行して、最適パラメーターを見つけると良いだろう

タイトルとURLをコピーしました