質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1701閲覧

ロジスティック回帰のアルゴリズムのロジックがよく分かりません。。

korr

総合スコア23

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/01/22 15:02

編集2019/01/22 15:03

前提・実現したいこと

ロジスティック回帰を用いて、irisの分類を行なっております。

該当のソースコード

# パッケージをインポート import numpy as np import matplotlib import matplotlib.pyplot as plt from sklearn import datasets from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.datasets import make_classification # データを取得 iris = datasets.load_iris() # irisの0列目と2列目を格納 X = iris.data[:, [0, 2]] # irisのクラスラベルを格納 y = iris.target # trainデータ、testデータの分割 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=42) # ロジスティック回帰モデルの構築 model = LogisticRegression() # train_Xとtrain_yを使ってモデルに学習させる model.fit(train_X, train_y) # test_Xに対するモデルの分類予測結果 y_pred = model.predict(test_X) print(y_pred) # 可視化の作業 plt.scatter(X[:, 0], X[:, 1], c=y, marker=".", cmap=matplotlib.cm.get_cmap(name="cool"), alpha=1.0) x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1 x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.02), np.arange(x2_min, x2_max, 0.02)) Z = model.predict(np.array([xx1.ravel(), xx2.ravel()]).T).reshape((xx1.shape)) plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=matplotlib.cm.get_cmap(name="Wistia")) plt.xlim(xx1.min(), xx1.max()) plt.ylim(xx2.min(), xx2.max()) plt.title("classification data using LogisticRegression") plt.xlabel("Sepal length") plt.ylabel("Petal length") plt.grid(True) plt.show()

このコードの中の可視化する部分の以下のコードのロジックがよく分かりません。

x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1 x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.02), np.arange(x2_min, x2_max, 0.02)) Z = model.predict(np.array([xx1.ravel(), xx2.ravel()]).T).reshape((xx1.shape))

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

コードを少し整理しました。

python

1import matplotlib.pyplot as plt 2import numpy as np 3from sklearn import datasets 4from sklearn.linear_model import LogisticRegression 5from sklearn.model_selection import train_test_split 6 7# データを取得 8iris = datasets.load_iris() 9X = iris.data[:, [0, 2]] 10Y = iris.target 11 12# 学習データとテストデータに分割する。 13X_train, X_test, Y_train, Y_test = train_test_split( 14 X, Y, test_size=0.3, random_state=42) 15 16# ロジスティック回帰モデルで学習する。 17model = LogisticRegression(solver='lbfgs', multi_class='multinomial') 18model.fit(X_train, Y_train) 19 20# テストデータを推論し、精度を出力する。 21Y_pred = model.score(X_test, Y_test) 22print('test accuracy: {:.2%}'.format(Y_pred))

python

1fig, ax = plt.subplots(figsize=(8, 6)) 2ax.set_title('classification data using LogisticRegression') 3ax.set_xlabel('Sepal length') 4ax.set_ylabel('Petal length') 5 6# サンプルを描画する。 7ax.scatter(X[:, 0], X[:, 1], c=y, marker='.', cmap='cool') 8 9xlim = ax.get_xlim() 10ylim = ax.get_ylim() 11X, Y = np.meshgrid(np.linspace(xlim[0], xlim[1], 1000), 12 np.linspace(ylim[0], ylim[1], 1000)) 13 14# 推論する。 15XY = np.column_stack([X.ravel(), Y.ravel()]) 16Z = model.predict(XY).reshape(X.shape) 17 18# 等高線を描画する。 19ax.contourf(X, Y, Z, alpha=0.4, cmap='Wistia') 20plt.show()

このコードの中の可視化する部分の以下のコードのロジックがよく分かりません。

numpy.meshgrid() でサンプルデータが存在する範囲に格子状の点を作成する。つまり、描画範囲を敷き詰めるように点を作成します。(下図の青が作成された点)

イメージ説明

numpy.meshgrid() の仕様

イメージ説明

そして、この各点での推論結果を計算します。
すると、各点の推論したラベルの値 (今回は0, 1, 2) が得られます。
これは以下のような関数とかんがられます。

イメージ説明

この関数の塗りつぶした等高線を contourf() で作成します。

contourf() の使い方

等高線ということは推論したラベルが同じ点は同じ色で塗られるので、結果、分類境界が描画されることとなります。

イメージ説明

投稿2019/01/22 15:43

編集2019/01/22 15:50
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

korr

2019/01/22 16:06

ご丁寧な解説ありがとうございます!図が大変参考になりイメージとしても理解することができました!
guest

0

結果を2次元平面上で可視化しているようですね。

python

1x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1 2x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1

この2行は可視化する領域を決めるために、0列目と1列目(それぞれ0つめと1つめの特徴量に対応)でそれぞれ最小値と最大値を拾っています。最小・最大より少し広めに取っておけば安心なので、-1と+1があります。

python

1xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.02), 2 np.arange(x2_min, x2_max, 0.02))

これについてはmeshgridとarangeの使い方を理解していないとわからないので、以下の参考リンクなどを御覧ください。

numpy.meshgrid — NumPy v1.15 Manual
numpy.arange — NumPy v1.15 Manual
配列の要素から格子列を生成するnumpy.meshgrid関数の使い方 - DeepAge
連番や等差数列を生成するnumpy.arange関数の使い方 - DeepAge

python

1Z = model.predict(np.array([xx1.ravel(), xx2.ravel()]).T).reshape((xx1.shape))

xx1xx2はそれぞれ2次元配列のようになっていて可視化する平面上の各点の値を表していますが、predictメソッドで予測するためにはそれぞれを一次元配列にして結合した後に転置し、特徴量ベクトルの配列にする必要があります。

予測した後に元のxx1,xx2と同じshapeにするためにreshapeメソッドを使っています。

predictメソッドに渡すまでの操作

python

1>>> import numpy as np 2>>> a = [1,2,3] 3>>> b = [4,5,6] 4>>> aa, bb = np.meshgrid(a, b) 5>>> aa 6array([[1, 2, 3], 7 [1, 2, 3], 8 [1, 2, 3]]) 9>>> bb 10array([[4, 4, 4], 11 [5, 5, 5], 12 [6, 6, 6]]) 13>>> aa.ravel() 14array([1, 2, 3, 1, 2, 3, 1, 2, 3]) 15>>> bb.ravel() 16array([4, 4, 4, 5, 5, 5, 6, 6, 6]) 17>>> np.array([aa.ravel(), bb.ravel()]) 18array([[1, 2, 3, 1, 2, 3, 1, 2, 3], 19 [4, 4, 4, 5, 5, 5, 6, 6, 6]]) 20>>> np.array([aa.ravel(), bb.ravel()]).T 21array([[1, 4], 22 [2, 4], 23 [3, 4], 24 [1, 5], 25 [2, 5], 26 [3, 5], 27 [1, 6], 28 [2, 6], 29 [3, 6]])

ここで、predictメソッドの返り値はnp.array([aa.ravel(), bb.ravel()]).Tの行数と同じになり、以下のようにreshapeで変換できます。

python

1>>> np.arange(9) # arangeで代用 2array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 3>>> np.arange(9).reshape(aa.shape) 4array([[0, 1, 2], 5 [3, 4, 5], 6 [6, 7, 8]]) 7

投稿2019/01/22 15:51

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

korr

2019/01/22 16:04

ご丁寧な説明ありがとうございます!単純化すると分かりやすくて大変参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問