歡迎您光臨本站 註冊首頁

sklearn的predict

←手機掃碼閱讀     e36605 @ 2020-06-29 , reply:0

發現個很有用的方法――predict_proba

今天在做資料預測的時候用到了,感覺很不錯,所以記錄分享一下,以後可能會經常用到。

我的理解:predict_proba不同於predict,它返回的預測值為,獲得所有結果的概率。(有多少個分類結果,每行就有多少個概率,以至於它對每個結果都有一個可能,如0、1就有兩個概率)

舉例:

獲取資料及預測程式碼:

  from sklearn.linear_model import LogisticRegression  import numpy as np     train_X = np.array(np.random.randint(0,10,size=30).reshape(10,3))  train_y = np.array(np.random.randint(0,2,size=10))  test_X = np.array(np.random.randint(0,10,size=12).reshape(4,3))     model = LogisticRegression()  model.fit(train_X,train_y)  test_y = model.predict_proba(test_X)     print(train_X)  print(train_y)  print(test_y)

 

訓練資料

  [[2 9 8]   [0 8 5]   [7 1 2]   [8 4 6]   [8 8 3]   [7 2 7]   [6 4 3]   [1 4 4]   [1 9 3]   [3 4 7]]

 

訓練結果,與訓練資料一一對應:

[1 1 1 0 1 1 0 0 0 1]
 

測試資料:

  [[4 3 0]  #測試資料   [3 0 4]   [2 9 5]   [2 8 5]]

 

測試結果,與測試資料一一對應:

  [[0.48753831 0.51246169]    [0.58182694 0.41817306]   [0.85361393 0.14638607]   [0.57018655 0.42981345]]

 

可以看出,有四行兩列,每行對應一條預測資料,兩列分別對應 對於0、1的預測概率(左邊概率大於0.5則為0,反之為1)

我們來看看使用predict方法獲得的結果:

test_y = model.predict(test_X)
 print(test_y)
 

輸出結果:[1,0,0,0]

所以有的情況下predict_proba還是很有用的,它可以獲得對每種可能結果的概率,使用predict則是直接獲得唯一的預測結果,所以在使用的時候,應該靈活使用。

補充一個知識點:關於預測結果標籤如何與原來標籤相對應

predict_proba返回所有標籤值可能性概率值,這些值是如何排序的呢?

返回模型中每個類的樣本概率,其中類按類self.classes_進行排序。

其中關鍵的步驟為numpy的unique方法,即通過np.unique(Label)方法,對Label中的所有標籤值進行從小到大的去重排序。得到一個從小到大唯一值的排序。這也就對應於predict_proba的行返回結果。

補充知識: python sklearn decision_function、predict_proba、predict

看程式碼~

  import matplotlib.pyplot as plt  import numpy as np  from sklearn.svm import SVC  X = np.array([[-1,-1],[-2,-1],[1,1],[2,1],[-1,1],[-1,2],[1,-1],[1,-2]])  y = np.array([0,0,1,1,2,2,3,3])  # y=np.array([1,1,2,2,3,3,4,4])  # clf = SVC(decision_function_shape="ovr",probability=True)  clf = SVC(probability=True)  clf.fit(X, y)  print(clf.decision_function(X))  '''  對於n分類,會有n個分類器,然後,任意兩個分類器都可以算出一個分類介面,這樣,用decision_function()時,對於任意一個樣例,就會有n*(n-1)/2個值。  任意兩個分類器可以算出一個分類介面,然後這個值就是距離分類介面的距離。  我想,這個函式是為了統計畫圖,對於二分類時最明顯,用來統計每個點離超平面有多遠,為了在空間中直觀的表示資料以及畫超平面還有間隔平面等。  decision_function_shape="ovr"時是4個值,為ovo時是6個值。  '''  print(clf.predict(X))  clf.predict_proba(X) #這個是得分,每個分類器的得分,取最大得分對應的類。  #畫圖  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, cmap=plt.cm.Paired)  plt.axis("tight")     class_names="ABCD"  plot_colors="rybg"  for i, n, c in zip(range(4), class_names, plot_colors):    idx = np.where(y == i) #i為0或者1,兩個類    plt.scatter(X[idx, 0], X[idx, 1],          c=c, cmap=plt.cm.Paired,          label="Class %s" % n)  plt.xlim(x_min, x_max)  plt.ylim(y_min, y_max)  plt.legend(loc='upper right')  plt.xlabel('x')  plt.ylabel('y')  plt.title('Decision Boundary')  plt.show()

 

 

                                                     

   


[e36605 ] sklearn的predict已經有226次圍觀

http://coctec.com/docs/python/shhow-post-240288.html