2017-03-08 3 views
2

ロジスティック回帰モデルをsklearnの虹彩データセットに適合させようとしています。私はそれがあまりにもフラットであるように見える確率曲線を得る、別名係数が小さすぎる。私は、がく片の長さ> 7によって確率90%以上を期待する:sklearn LogisticRegression - プロットの表示が小さすぎる

enter image description here

は確かに間違っている、この確率曲線ですか?もしそうなら、私のコードで何が起こるかもしれませんか?

from sklearn import datasets 
import matplotlib.pyplot as plt 
import numpy as np 
import math 

from sklearn.linear_model import LogisticRegression 

data = datasets.load_iris() 

#get relevent data 
lengths = data.data[:100, :1] 
is_setosa = data.target[:100]   

#fit model 
lgs = LogisticRegression() 
lgs.fit(lengths, is_setosa) 
m = lgs.coef_[0,0] 
b = lgs.intercept_[0] 

#generate values for curve overlay 
lgs_curve = lambda x: 1/(1 + math.e**(-(m*x+b)))   
x_values = np.linspace(2, 10, 100) 
y_values = lgs_curve(x_values) 

#plot it 
plt.plot(x_values, y_values) 
plt.scatter(lengths, is_setosa, c='r', s=2) 
plt.xlabel("Sepal Length") 
plt.ylabel("Probability is Setosa") 
+1

カーブについてはどうなりますか?それは私によく見えます。あなたが得るものと、それがあなたの期待をどれくらい満たしていないのかを特定し、特定してください。 – ImportanceOfBeingErnest

+0

ご報告いただきありがとうございます。私はちょうどそれをもっと明確にしようと編集しました。 – Selah

答えて

1

を回帰モデル。

C:浮動小数点、デフォルト:1.0正規化強度の逆数。 正の浮動小数点数である必要があります。サポートベクターマシンの場合と同様に、より小さな値 はより強力な正則化を指定します。今

あなたはこの正則パラメータの異なる値をしようとした場合、あなたはCの大きな値は、バイナリ出力の0〜1の値からシャープな遷移を持ってフィッティング曲線(レスポンス)につながることがわかります変数、そしてさらに大きな値が分散の高いモデルに適合するようになります(トレーニングデータの遷移をより密接にモデル化しようとしています)。Cの値を10と同じように設定してください。時間はリスクを持つ可能性がありますオーバーフィット、 Eデフォルト値C=1とは、高バイアスへのリードよりも小さい値とunderfitに可能性があり、ここで有名なバイアス・分散トレードオフにおける機械学習をしています。

クロスバリデーションのようなテクニックを使用して、いつでも適切な値のCを選択することができます。次のコード/図は、(1から10に、正則化パラメータCの異なる値を有する、すなわち、)異なる複雑さのモデルを取り付けた確率曲線を示す:Cの異なる値を装着モデルと

x_values = np.linspace(2, 10, 100) 
x_test = np.reshape(x_values, (100,1)) 

C = list(range(1, 11)) 
labels = map(str, C) 
for i in range(len(C)): 
    lgs = LogisticRegression(C = C[i]) # pass a value for the regularization parameter C 
    lgs.fit(lengths, is_setosa) 
    y_values = lgs.predict_proba(x_test)[:,1] # use this function to compute probability directly 
    plt.plot(x_values, y_values, label=labels[i]) 

plt.scatter(lengths, is_setosa, c='r', s=2) 
plt.xlabel("Sepal Length") 
plt.ylabel("Probability is Setosa") 
plt.legend() 
plt.show() 

予測ちゃったごめんなさい

enter image description here

+1

これは役に立ちました、ありがとう!もし私が正規化をしたくないのであれば、私はCに何を設定できますか? (私はそれがテスト精度の低下につながることを認識していますが、これは理論的なものです) – Selah

+0

10,100,1000など(理想的には無限大)を試すことができますが、100や1000は私が思う目的に役立つはずです。 –

+1

本当にありがとう、ありがとう。 – Selah

0

あなたがプロットしたいのかについては説明しませんが、私はあなたが分離線をプロットしたいと仮定します。 Logistic/Sigmoid機能に関してあなたは混乱しているようです。ロジスティック回帰の決定関数は線である。

+0

私は、虹彩がSepal Lengthに基づいてSetosaタイプである確率をプロットしています。この確率は、モデルをデータポイントに合わせることによって得られます(赤色)。確率関数はシグモイド関数である。 – Selah

0

「ズームイン」が大きすぎるため、確率グラフがフラットに見えます。

あなたはシグモイド関数の途中を見れば、それは二階微分はのは、ほぼ0であることを得るようのは、ほぼ直線であることを取得する(例えば参照wolfram alpha graph

値のは、我々が話していることに注意してください enter image description here

しかし、他のハンに:私たちはあなたのグラフの限界を軽減する場合について-(m*x+b)

の結果があり、私たちはラインのように見える何かを得る、 x_values = np.linspace(4, 7, 100)を使用して言いますD、我々は限界と夢中場合、x_values = np.linspace(-10, 20, 100)を使用することによって、我々は明確シグモイド取得言う:あなたはhttp://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegressionを参照している場合、あなたはロジスティックを訓練しながら、引数として渡すことができる正則化パラメータCを見つけるでしょう enter image description here

+1

x軸の制限を調整する方法については、しかし、あなたがsepal length> 7で私の確率はまだ80%を下回っていることがあなたにとって間違っているようには見えませんか?それが私を混乱させています。 – Selah

関連する問題