# 概率回歸
> 原文:[https://www.textbook.ds100.org/ch/17/classification_prob.html](https://www.textbook.ds100.org/ch/17/classification_prob.html)
```
# HIDDEN
# Clear previously defined variables
%reset -f
# Set directory for data loading to work properly
import os
os.chdir(os.path.expanduser('~/notebooks/17'))
```
```
# HIDDEN
import warnings
# Ignore numpy dtype warnings. These warnings are caused by an interaction
# between numpy and Cython and can be safely ignored.
# Reference: https://stackoverflow.com/a/40846742
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ufunc size changed")
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline
import ipywidgets as widgets
from ipywidgets import interact, interactive, fixed, interact_manual
import nbinteract as nbi
sns.set()
sns.set_context('talk')
np.set_printoptions(threshold=20, precision=2, suppress=True)
pd.options.display.max_rows = 7
pd.options.display.max_columns = 8
pd.set_option('precision', 2)
# This option stops scientific notation for pandas
# pd.set_option('display.float_format', '{:.2f}'.format)
```
```
# HIDDEN
def df_interact(df, nrows=7, ncols=7):
'''
Outputs sliders that show rows and columns of df
'''
def peek(row=0, col=0):
return df.iloc[row:row + nrows, col:col + ncols]
if len(df.columns) <= ncols:
interact(peek, row=(0, len(df) - nrows, nrows), col=fixed(0))
else:
interact(peek,
row=(0, len(df) - nrows, nrows),
col=(0, len(df.columns) - ncols))
print('({} rows, {} columns) total'.format(df.shape[0], df.shape[1]))
```
```
# HIDDEN
def jitter_df(df, x_col, y_col):
x_jittered = df[x_col] + np.random.normal(scale=0, size=len(df))
y_jittered = df[y_col] + np.random.normal(scale=0.05, size=len(df))
return df.assign(**{x_col: x_jittered, y_col: y_jittered})
```
在籃球運動中,運動員通過一個籃筐射門得分。其中一位球員,勒布朗·詹姆斯,因其不可思議的得分能力被廣泛認為是有史以來最好的籃球運動員之一。

勒布朗在美國超級籃球聯盟國家籃球協會(NBA)打球。我們使用 NBA 統計網站([https://stats.nba.com/](https://stats.nba.com/))收集了勒布朗在 2017 年 NBA 季后賽中所有嘗試的數據集。
```
lebron = pd.read_csv('lebron.csv')
lebron
```
| | 游戲日期 | 分鐘 | 對手 | 動作類型 | 鏡頭類型 | 射擊距離 | 拍攝 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 零 | 20170415 年 | 10 個 | 因德 | 駕駛上籃得分 | 2pt 現場目標 | 零 | 0 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1 個 | 20170415 | 11 個 | IND | Driving Layup Shot | 2PT Field Goal | 0 | 1 個 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 二 | 20170415 | 十四 | IND | 上籃得分 | 2PT Field Goal | 0 | 1 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| …… | …… | ... | ... | ... | ... | ... | ... |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 三百八十一 | 20170612 年 | 46 歲 | GSW | Driving Layup Shot | 2PT Field Goal | 1 | 1 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 382 個 | 20170612 | 47 歲 | GSW | 后仰跳投 | 2PT Field Goal | 14 | 0 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 三百八十三 | 20170612 | 48 歲 | GSW | Driving Layup Shot | 2PT Field Goal | 二 | 1 |
| --- | --- | --- | --- | --- | --- | --- | --- |
384 行×7 列
此數據集的每一行都包含 Lebron 嘗試拍攝的照片的以下屬性:
* `game_date`:比賽日期。
* `minute`:嘗試射門的分鐘數(每場 NBA 比賽 48 分鐘)。
* `opponent`:勒布朗對手的球隊縮寫。
* 【HTG0】:鏡頭前的動作類型。
* `shot_type'`:放炮類型(2 分或 3 分)。
* `shot_distance`:勒布朗嘗試射門時與籃筐的距離(英尺)。
* `shot_made`:`0`如果沒打中,如果打中,則`1`。
我們想用這個數據集來預測勒布朗是否會在未來出擊。這是一個 _ 分類問題 _;我們預測一個類別,而不是像在回歸中那樣的連續數。
我們可以通過預測一個鏡頭將進入的 _ 概率 _,將這個分類問題重新定義為一種回歸問題。例如,我們預計當勒布朗離籃筐越遠時,他投籃的概率就越低。
我們繪制了下面的射門嘗試圖,顯示了 X 軸上與籃筐的距離以及他是否在 Y 軸上射門。稍微抖動 Y 軸上的點可以減少過度繪制。
```
# HIDDEN
np.random.seed(42)
sns.lmplot(x='shot_distance', y='shot_made',
data=jitter_df(lebron, 'shot_distance', 'shot_made'),
fit_reg=False,
scatter_kws={'alpha': 0.3})
plt.title('LeBron Shot Make vs. Shot Distance');
```

我們可以看到,當勒布朗離籃筐只有 5 英尺時,他往往投得最多。一個簡單的最小二乘線性回歸模型適合這個數據,產生以下預測:
```
# HIDDEN
np.random.seed(42)
sns.lmplot(x='shot_distance', y='shot_made',
data=jitter_df(lebron, 'shot_distance', 'shot_made'),
ci=None,
scatter_kws={'alpha': 0.4})
plt.title('Simple Linear Regression');
```

線性回歸預測連續值。但是,要執行分類,我們需要將該值轉換為一個類別:放炮或未放炮。我們可以通過設置一個截止值或**分類閾值**來實現這一點。如果回歸預測的值大于 0.5,我們預測放炮會發生。否則,我們就預測這次射擊會失敗。
我們在下面畫一條綠色虛線。根據這個截止點,我們的模型預測,如果勒布朗在籃筐 15 英尺以內,他會投籃。
```
# HIDDEN
np.random.seed(42)
sns.lmplot(x='shot_distance', y='shot_made',
data=jitter_df(lebron, 'shot_distance', 'shot_made'),
ci=None,
scatter_kws={'alpha': 0.4})
plt.axhline(y=0.5, linestyle='--', c='g')
plt.title('Cutoff for Classification');
```

在上面的步驟中,我們嘗試執行回歸來預測一次放炮的可能性。如果我們的回歸產生了一個概率,那么設定 0.5 的臨界值意味著我們預測當我們的模型認為一個鏡頭進入的可能性比丟失的鏡頭更大時,一個鏡頭會進入。我們將在本章后面重新討論分類閾值的主題。
## 概率線性回歸問題
不幸的是,我們的線性模型的預測不能解釋為概率。有效概率必須介于 0 和 1 之間,但我們的線性模型違反了這一條件。例如,當勒布朗距離籃筐 100 英尺時,他投籃的概率應該接近于零。然而,在這種情況下,我們的模型將預測負值。
如果我們改變我們的回歸模型,使它的預測可以被解釋為概率,我們就不會對使用它的預測進行分類感到不安。我們用一個新的預測函數和一個新的損失函數來實現這一點。生成的模型稱為**邏輯模型**。
- 一、數據科學的生命周期
- 二、數據生成
- 三、處理表格數據
- 四、數據清理
- 五、探索性數據分析
- 六、數據可視化
- Web 技術
- 超文本傳輸協議
- 處理文本
- python 字符串方法
- 正則表達式
- regex 和 python
- 關系數據庫和 SQL
- 關系模型
- SQL
- SQL 連接
- 建模與估計
- 模型
- 損失函數
- 絕對損失和 Huber 損失
- 梯度下降與數值優化
- 使用程序最小化損失
- 梯度下降
- 凸性
- 隨機梯度下降法
- 概率與泛化
- 隨機變量
- 期望和方差
- 風險
- 線性模型
- 預測小費金額
- 用梯度下降擬合線性模型
- 多元線性回歸
- 最小二乘-幾何透視
- 線性回歸案例研究
- 特征工程
- 沃爾瑪數據集
- 預測冰淇淋評級
- 偏方差權衡
- 風險和損失最小化
- 模型偏差和方差
- 交叉驗證
- 正規化
- 正則化直覺
- L2 正則化:嶺回歸
- L1 正則化:LASSO 回歸
- 分類
- 概率回歸
- Logistic 模型
- Logistic 模型的損失函數
- 使用邏輯回歸
- 經驗概率分布的近似
- 擬合 Logistic 模型
- 評估 Logistic 模型
- 多類分類
- 統計推斷
- 假設檢驗和置信區間
- 置換檢驗
- 線性回歸的自舉(真系數的推斷)
- 學生化自舉
- P-HACKING
- 向量空間回顧
- 參考表
- Pandas
- Seaborn
- Matplotlib
- Scikit Learn