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つを実行して、最適パラメーターを見つけると良いだろう