2017-11-17 10 views
1

私はsklearn内でもっとすべてをやろうとしています。ここでは、不均衡な分類セットを生成し、ロジスティック回帰を実行し、データポイントをプロットし、決定境界線をプロットしようとしています。python:ロジスティック回帰係数を使用してsklearnの決定境界を構成する方法

決定境界線をプロットするためには、私は最初の係数を得る:

coef = clf.best_estimator_.coef_ 
intercept = clf.best_estimator_.intercept_ 

をそして、私はラインを構築:

x1 = np.linspace(-8, 10, 100) 
x2 = -(coef[0][0] * x1 + intercept[0])/coef[0][1] 
plt.plot(x1, x2, color='#414e8a', linewidth=2) 

ただし、ラインはX2のでプロットしていませんcoef [0] [1]は0に等しいので、すべてinfです。これが私が持つ問題です。なぜこれらの係数の第2項は0ですか?以下

完全なコードは:あなたはCOEFで第2項は0

で見ることができるように

from sklearn.datasets import make_classification 
from sklearn.decomposition import PCA 
import matplotlib.pyplot as plt 
from sklearn.linear_model import LogisticRegression 
from sklearn.metrics import classification_report 
from sklearn.grid_search import GridSearchCV 
from sklearn.cross_validation import KFold, train_test_split 
import numpy as np 
import pandas as pd 
import warnings 

warnings.filterwarnings('ignore') 
%pylab inline 
pylab.rcParams['figure.figsize'] = (12, 6) 
plt.style.use('fivethirtyeight') 
from IPython.core.display import display, HTML 
display(HTML("<style>.container { width:100% !important; }</style>")) 

# Generate data with two classes 
X, y = make_classification(class_sep=1.2, weights=[0.1, 0.9], n_informative=3, n_redundant=1, n_features=5, n_clusters_per_class=1, n_samples=10000, flip_y=0, random_state=10) 
pca = PCA(n_components=2) 
X = pca.fit_transform(X) 

y = y.astype('str') 
y[y=='1'] ='L' 
y[y=='0'] ='S' 

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=0) 

X_1, X_2 = X_train[y_train=='S'], X_train[y_train=='L'] 

# Fit a Logistic Regression model 
clf_base = LogisticRegression() 
grid = {'C': 10.0 ** np.arange(-2, 3),'penalty': ['l1', 'l2']} 
cv = KFold(X_train.shape[0], n_folds=5, shuffle=True, random_state=0) 
clf = GridSearchCV(clf_base, grid, cv=cv, n_jobs=8, scoring='f1_macro') 
clf.fit(X_train, y_train) 

# Get coefficients 
coef = clf.best_estimator_.coef_ 
intercept = clf.best_estimator_.intercept_ 

# Create separation line 
x1 = np.linspace(-8, 10, 100) 
x2 = -(coef[0][0] * x1 + intercept[0])/coef[0][1] 

plt.scatter(X_1[:,0], X_1[:,1], color='#1abc9c') 
plt.scatter(X_2[:,0], X_2[:,1], color='#e67e22') 
x_coords = np.concatenate([X_1[:,0],X_2[:,0]]) 
y_coords = np.concatenate([X_1[:,1],X_2[:,1]]) 
plt.axis([min(x_coords), max(x_coords), min(y_coords), max(y_coords)]) 
plt.title("Original Dataset - Fitted Logistic Regression") 
plt.plot(x1, x2, color='#414e8a', linewidth=2) 
plt.show() 

print(coef) 

は、私がここで間違って何をしているのですか?

ありがとうございました!

EDITは

これは、グリッドの検索パラメータがゼロである第2の係数につながっているように思えます。たとえば、次のように

grid = {'C': 10.0 ** np.arange(-2, 3),'penalty': ['l1', 'l2']} 

この:

grid = {'C': 10.0 ** np.arange(-2, 3),'penalty': ['l1', 'l2'],'class_weight': ['balanced']} 

これは私に二つの非ゼロcoeficients

私はクラスの重みパラメータを削除

を与える:私は、グリッドのパラメータを設定し

coefの2番目の要素の値が0になります。

この問題を単純化することができます。誰でもそこに誰かがアイデアを持っていますか?ありがとうございました!

+0

ロジスティック回帰 – ErroriSalvo

+0

私は従わないのですか? –

答えて

0

強力なL1正則化を使用するため、最初の係数がゼロになります。これは、あまり役に立たない機能をすべてモデルから削除します。

clf.best_params_と表示されます。これは{'C': 0.01, 'penalty': 'l1'}と同じです。 'l2'ペナルティに切り替えると、すべての係数がゼロ以外になります。

フォームAx+By+C=0の任意の行をプロットしたい場合は、この機能を使用することができます。

import matplotlib.pyplot as plt 
import numpy as np 

def plot_normal_line(A, B, C, ax=None, **kwargs): 
    """ Plot equation of Ax+By+C=0""" 
    if ax is None: 
     ax = plt.gca() 
    if A == 0 and B == 0: 
     raise Exception('A or B should be non-zero') 
    if B == 0: 
     # plot vertical 
     ax.vlines(-C/A, *ax.get_ylim(), **kwargs) 
    else: 
     # plot functoon 
     x = np.array(ax.get_xlim()) 
     y = (A*x+C)/-B 
     ax.plot(x, y, **kwargs) 

次にコマンドplot_normal_line(*coef[0], intercept)はあなたの決定境界を描画します。

しかし、あなたのデータセットはバランスが取れているので、ほぼすべての点について、最も確率の高いクラスは2番目のクラス(オレンジ色)です。だから、50%の確率(黒い太線)のための決定境界は、散布から左に位置:

enter image description here

関連する問題