機械学習のアルゴリズムをまとめたモジュールscikit-learnを学ぶ.
簡単なアルゴリズムを用いた実験と評価について,コードを読みつつ知る.
scikit-learnのホームページに詳しい情報がある.
例題としてIrisデータセットを用いる.
Irisはアヤメのデータであり,3種類の花があり,花の大きさなどの4つの特徴が与えられている.
花の大きさなどの4つの特徴から,どの花なのかを予測する問題を解いてみよう.
In [1]:
# 1. データセットを用意する
from sklearn import datasets
iris = datasets.load_iris() # ここではIrisデータセットを読み込む
print(iris.data[0], iris.target[0]) # 1番目のサンプルのデータとラベル
In [2]:
# 2.学習用データとテスト用データに分割する
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target)
# 3. 線形SVMという手法を用いて分類する
from sklearn.svm import SVC, LinearSVC
clf = LinearSVC()
clf.fit(X_train, y_train) # 学習
Out[2]:
In [3]:
# 4. 分類器の性能を測る
y_pred = clf.predict(X_test) # 予測
from sklearn import metrics
print(metrics.classification_report(y_true=y_test, y_pred=y_pred)) # 予測結果の評価
性能を測るといっても,その目的によって指標を変える必要がある. どのような問題で,どのような指標を用いることが一般的か?という問いに対しては,先行研究を確認することを勧める. また,指標それぞれの特性(数学的な意味)を知っていることもその役に立つだろう. 参考文献:scikit-learn Model Evaluation
例えば,今回の分類問題に対する指標について考えてみよう.一般的な指標だけでも以下の4つがある.
(精度,再現率,F値にはmacro, micro, weightedなどがある)
今回の実験でのそれぞれの値を見てみよう.
In [4]:
print('accuracy: ', metrics.accuracy_score(y_test, y_pred))
print('precision:', metrics.precision_score(y_test, y_pred, average='macro'))
print('recall: ', metrics.recall_score(y_test, y_pred, average='macro'))
print('F1 score: ', metrics.f1_score(y_test, y_pred, average='macro'))
In [5]:
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X, y = iris.data, iris.target
X_pca = pca.fit_transform(X) # 次元圧縮
print(X_pca.shape)
In [6]:
import matplotlib.pyplot as plt
%matplotlib inline
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y);
In [7]:
from sklearn.svm import SVC
# 次元圧縮したデータを用いて分類してみる
X_train, X_test, y_train, y_test = train_test_split(X_pca, iris.target)
clf = LinearSVC()
clf.fit(X_train, y_train)
y_pred2 = clf.predict(X_test)
In [8]:
from sklearn import metrics
print(metrics.classification_report(y_true=y_test, y_pred=y_pred2)) # 予測結果の評価
In [9]:
from sklearn.datasets import fetch_20newsgroups
categories = ['alt.atheism', 'soc.religion.christian','comp.graphics', 'sci.med']
news_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)
In [10]:
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
count_vec = CountVectorizer()
X_train_counts = count_vec.fit_transform(news_train.data)
In [11]:
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)
In [12]:
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tf, news_train.target)
In [13]:
docs = ["God is love.", "I study about Computer Science."]
X_test_counts = count_vec.transform(docs)
X_test_tf = tf_transformer.transform(X_test_counts)
preds = clf.predict(X_test_tf)
for d, label_id in zip(docs, preds):
print("{} -> {}".format(d, news_train.target_names[label_id]))
In [14]:
from sklearn.pipeline import Pipeline
text_clf = Pipeline([('countvec', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', MultinomialNB())])
text_clf.fit(news_train.data, news_train.target)
Out[14]:
In [15]:
for d, label_id in zip(docs, text_clf.predict(docs)):
print("{} -> {}".format(d, news_train.target_names[label_id]))