2016-11-17 114 views
3

你是如何處理的圖表所示:enter image description hereLogistic迴歸在scikitlearn

使用scikitlearn的邏輯迴歸模型。有沒有辦法使用scikitlearn和一個標準的X,Y輸入輕鬆地處理這些類型的問題,這些輸入映射到像這樣的圖形?

+2

LR只能處理其原始形式的線性可分類。 – Kh40tiK

+1

我不認爲這裏提供的數據是線性分離的 – Backtrack

+2

你不能使用logistic這個,但你可以使用徑向(循環)內核的SVM。 http://scikit-learn.org/stable/modules/svm.html – Wboy

回答

2

如果你真的想在這個特定的設置中使用Logistic迴歸,一個很有前途的方法是將座標從笛卡爾系統轉換到Polar系統。從可視化的角度來看,在這些系統中,數據似乎是(幾乎)線性分離的。 Python conversion between coordinates

+0

這是一個很棒的想法,我從來沒有想過這樣做 – Rob

1

正如其他人說,好,因爲它是一個線性分類Logistic迴歸不能處理這種類型的數據:

這可以通過這裏所描述來完成。您可以轉換數據以使其可線性分離,或選擇另一種更適合此類數據的分類器。

在scikit-learn文檔中,各種分類器如何處理這個問題有很好的可視化:請參閱http://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html。第二行是你的任務:

enter image description here

+0

很酷的圖形謝謝 – Rob

1

已經有幾個答案已,但他們都沒有提到數據的任何預處理。所以我會展示你的問題的兩種方式。

一起來我會看一些流形學習到你的數據轉換到另一個空間

# Do some imports that I'll be using 
from sklearn import datasets, manifold, linear_model 
from sklearn import model_selection, ensemble, metrics 
from matplotlib import pyplot as plt 

%matplotlib inline 

# Make some data that looks like yours 
X, y = datasets.make_circles(n_samples=200, factor=.5, 
          noise=.05) 

,首先讓我們看一下你目前的問題

plt.scatter(X[:, 0], X[:, 1], c=y) 
clf = linear_model.LogisticRegression() 
scores = model_selection.cross_val_score(clf, X, y) 
print scores.mean() 

輸出

Scatter plot of your data

0.440433749257 

所以你可以看到這個數據看起來像你的,我們得到了一個可怕的交叉驗證準確性與邏輯迴歸。所以,如果你真的附着Logistic迴歸,我們可以做的是使用某種形學習項目的數據轉換成不同的空間,例如:

Xd = manifold.LocallyLinearEmbedding().fit_transform(X) 
plt.scatter(Xd[:, 0], Xd[:, 1], c=y) 
clf = linear_model.LogisticRegression() 
scores = model_selection.cross_val_score(clf, Xd, y) 
print scores.mean() 

輸出

enter image description here

1.0 

所以你可以看到,現在你的數據是perfectally從LocallyLinearEmbedding我們得到一個更好的分類精度線性可分!

其他可供您使用的選項,其他人提到的選項是使用不同的模型。雖然有很多可供選擇的選項,但我只是使用RandomForestClassifier來舉例說明。我只會訓練一半的數據,所以我們可以評估一個偏差集的準確性。我以前只使用簡歷,因爲它簡單快捷!

clf = ensemble.RandomForestClassifier().fit(X[:100], y[:100]) 
print metrics.accuracy_score(y[100:], clf.predict(X[100:])) 

輸出

0.97 

因此,我們得到一個良好的精度!如果你有興趣看看發生了什麼,我們可以從one of the awesomescikit-learn教程中提取一些代碼。

plot_step = 0.02 
x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1 
y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1 
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step), 
        np.arange(y_min, y_max, plot_step)) 

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) 
Z = Z.reshape(xx.shape) 
cs = plt.contourf(xx, yy, Z, alpha=0.5) 
plt.scatter(X[:, 0], X[:, 1], c=y) 

輸出

Decision boundry of RF classifier

因此,這表明,被分爲使用隨機森林模型中的每個類的空間領域。

解決同一問題的兩種方法。我離開鍛鍊哪一個最適合作爲練習讀者...

+0

好例子!雖然前面提到的兩個答案都是預處理:「變換座標」和「變換數據以使其線性可分」。 –

+0

謝謝!是的,我把很多術語混淆成了一個答案。我應該更加一致,但不太確定哪個是最好的術語。 – ncfirth