# 模型
> 原文:[https://www.bookbookmark.ds100.org/ch/10/modeling_simple.html](https://www.bookbookmark.ds100.org/ch/10/modeling_simple.html)
```
# HIDDEN
# Clear previously defined variables
%reset -f
# Set directory for data loading to work properly
import os
os.chdir(os.path.expanduser('~/notebooks/10'))
```
```
# 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)
```
在美國,許多用餐者會在用餐者付錢時給他們的服務員留下小費。盡管美國習慣于提供 15%的小費,但也許有些餐館的顧客比其他餐館更慷慨。
一個特別的服務員對他能得到多少小費非常感興趣,他收集了他在一個月工作期間提供的所有桌子的信息。
```
# HIDDEN
tips = sns.load_dataset('tips')
tips
```
| | 賬單合計 | 提示 | 性別 | 吸煙者 | 白天 | 時間 | 大小 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 零 | 十六點九九 | 1.01 年 | 女性 | 不 | 太陽 | 晚餐 | 二 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1 個 | 十點三四 | 一點六六 | 男性 | No | Sun | Dinner | 三 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 二 | 二十一點零一 | 3.50 美元 | Male | No | Sun | Dinner | 3 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| …… | …… | ... | ... | ... | ... | ... | ... |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 241 個 | 二十二點六七 | 2.00 美元 | Male | 是的 | 坐 | Dinner | 2 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 二百四十二 | 十七點八二 | 1.75 美元 | Male | No | Sat | Dinner | 2 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 二百四十三 | 十八點七八 | 3 點 | Female | No | 周四 | Dinner | 2 |
| --- | --- | --- | --- | --- | --- | --- | --- |
244 行×7 列
我們可以繪制尖端數量的柱狀圖:
```
# HIDDEN
sns.distplot(tips['tip'], bins=np.arange(0, 10.1, 0.25), rug=True)
plt.xlabel('Tip Amount in Dollars')
plt.ylabel('Proportion per Dollar');
```

數據中已經有一些有趣的模式。例如,有一個清晰的模式是 2 美元,大多數提示似乎是 0.50 美元的倍數。
目前,我們對小費百分比最感興趣:小費金額除以賬單金額。我們可以在數據框架中為這個變量創建一個列并顯示它的分布。
```
# HIDDEN
tips['pcttip'] = tips['tip'] / tips['total_bill'] * 100
sns.distplot(tips['pcttip'], rug=True)
plt.xlabel('Percent Tip Amount')
plt.ylabel('Proportion per Percent');
```

看起來有一張桌子給了我們的服務員 70 美元的小費!然而,大部分小費百分比低于 30 美元。讓我們放大分布的那部分。
```
# HIDDEN
sns.distplot(tips['pcttip'], bins=np.arange(30), rug=True)
plt.xlim(0, 30)
plt.xlabel('Percent Tip Amount')
plt.ylabel('Proportion per Percent');
```

我們可以看到分布大致集中在$15\%$和另一個潛在模式$20\%$之間。假設我們的服務員有興趣預測他從一張給定的桌子上能得到多少小費。為了解決這個問題,我們可以創建一個服務生能得到多少小費的模型。
### 一個簡單的模型
一個簡單的模型是完全忽略數據,并聲明由于美國的慣例是給 15%的小費,服務員總是從他的桌子上得到 15%的小費。雖然非常簡單,但我們將使用這個模型來定義一些稍后將使用的變量。
這個模型假設有一個正確的百分比提示,所有的表,過去和未來,都將給服務員。這是百分比提示的 _ 填充參數 _,我們將用$\theta^*$表示。
在做出這個假設之后,我們的模型說我們對$\theta^*$的猜測是$15\%$。我們將使用$\theta$來表示當前的猜測。
在數學符號中,我們的模型指出:
$$\theta=15$$
如果模型是真的,那么這個模型顯然是有問題的,我們數據集中的每個表都應該給服務員 15%的小費。盡管如此,這個模型將對許多場景做出合理的猜測。事實上,如果我們沒有其他信息,除了服務員受雇于美國之外,這個模型可能是最有用的選擇。
但是,由于我們的服務生收集了數據,我們可以使用他的提示歷史來創建模型,而不是僅根據慣例選擇 15%。
### 損失函數直覺
為了方便起見,下面復制了數據集中提示百分比的分布。
```
# HIDDEN
sns.distplot(tips['pcttip'], bins=np.arange(30), rug=True)
plt.xlim(0, 30)
plt.xlabel('Percent Tip Amount')
plt.ylabel('Proportion per Percent');
```

假設我們正在比較兩個選項,分別是:$10\%$和$15\%$。我們可以在發行版上標記這兩種選擇:
```
# HIDDEN
sns.distplot(tips['pcttip'], bins=np.arange(30), rug=True)
plt.axvline(x=10, c='darkblue', linestyle='--', label=r'$ \theta = 10$')
plt.axvline(x=15, c='darkgreen', linestyle='--', label=r'$ \theta = 15$')
plt.legend()
plt.xlim(0, 30)
plt.xlabel('Percent Tip Amount')
plt.ylabel('Proportion per Percent');
```

直觀地說,在給定數據集的情況下,選擇$\theta=15$比選擇$\theta=10$更有意義。這是為什么?當我們查看數據中的點時,我們可以看到更多的點接近 15 美元,而不是 10 美元。
雖然看起來很明顯,$\theta=15$比$\theta=10$是更好的選擇,但還不太清楚,$\theta=15$是否比$\theta=16$更好。為了在不同的$\theta$值之間做出精確的選擇,我們要為每個$\theta$值分配一個數字,該數字測量數據的“好”程度。也就是說,我們需要一個函數,它將輸入一個$\theta$值和數據集中的點,輸出一個單一的數字,我們將使用它來選擇我們可以選擇的最佳值$\theta$。
我們稱此函數為**損失函數**。
- 一、數據科學的生命周期
- 二、數據生成
- 三、處理表格數據
- 四、數據清理
- 五、探索性數據分析
- 六、數據可視化
- Web 技術
- 超文本傳輸協議
- 處理文本
- python 字符串方法
- 正則表達式
- regex 和 python
- 關系數據庫和 SQL
- 關系模型
- SQL
- SQL 連接
- 建模與估計
- 模型
- 損失函數
- 絕對損失和 Huber 損失
- 梯度下降與數值優化
- 使用程序最小化損失
- 梯度下降
- 凸性
- 隨機梯度下降法
- 概率與泛化
- 隨機變量
- 期望和方差
- 風險
- 線性模型
- 預測小費金額
- 用梯度下降擬合線性模型
- 多元線性回歸
- 最小二乘-幾何透視
- 線性回歸案例研究
- 特征工程
- 沃爾瑪數據集
- 預測冰淇淋評級
- 偏方差權衡
- 風險和損失最小化
- 模型偏差和方差
- 交叉驗證
- 正規化
- 正則化直覺
- L2 正則化:嶺回歸
- L1 正則化:LASSO 回歸
- 分類
- 概率回歸
- Logistic 模型
- Logistic 模型的損失函數
- 使用邏輯回歸
- 經驗概率分布的近似
- 擬合 Logistic 模型
- 評估 Logistic 模型
- 多類分類
- 統計推斷
- 假設檢驗和置信區間
- 置換檢驗
- 線性回歸的自舉(真系數的推斷)
- 學生化自舉
- P-HACKING
- 向量空間回顧
- 參考表
- Pandas
- Seaborn
- Matplotlib
- Scikit Learn