使用捨去離群值與調整離群值的方法結果會一樣嗎?
我覺得兩個應該是一樣的啊, 主要是刪去條件有沒有包含邊界值
將下方>500 and <2000改成 >=500 , <=2000
會得到一樣的結果耶,還是我的理解有錯??
調整離群值:df['1stFlrSF'] = df['1stFlrSF'].clip(500, 2000)
捨棄離群值:keep_indexs = (df['1stFlrSF']> 500) & (df['1stFlrSF']< 2000)
回答列表
-
2019/09/20 上午 00:09Wei-po Tsai贊同數:1不贊同數:0留言數:0
Hi!同學你好:
============================================
我是偽菠菜(Wei-Po Tsai),是個剛學Python的新手,
對你提到的問題很有興趣,所以研究了一下,請多指教。
============================================
調整離群值 和 捨棄離群值 是不同的概念喔!為了容易理解,我舉了以下例子,供你參考:
1.首先,我們先給出2個順子:[2 3 4 5 6]
2. 使用 調整離群值,看看結果:
→將小於「4」的數字調整成「4」
→將大於「5」的數字調整為「5」。
3. 使用 捨棄離群值,看看結果:
→將小於「4」的數字捨棄
→將大於「5」的數字捨棄
是不是覺得很有趣呢?(如果覺得例子舉的很爛 還請包涵...)
Edited By:偽菠菜(Wei-Po Tsai)
-
2019/09/20 上午 00:31張維元 (WeiYuan)贊同數:0不贊同數:0留言數:0
嗨,我看不太懂你的問題!可以再補充多一點資訊嗎?你想問為什麼「調整離群值」跟「捨棄離群值」會得到一樣的結果嗎?
-
2019/09/20 下午 00:01陳明佑 (Ming You Chen)贊同數:0不贊同數:0留言數:0
假設原本訓練資料有100筆, 其中指定欄位超出範圍的特徵有20筆
- 調整離群值, 是讓資料仍舊保有100筆, 但這20筆的資料修正到不超出邊界
- 捨棄離群值, 就是讓資料只留下沒超出界線的80筆
(謝謝偽菠菜同學的補充, 他說得很正確喔)
你所謂"一樣的結果", 中文上可能有下面兩種意義, 這次就分別說明, 希望同學下次能描述更清楚些
[資料保持一樣]
這就表示程式寫錯/理解錯, 或者所有資料都沒超界,
不然資料光筆數, 就不會一樣多, 你可以印出 df.shape 確認看看
keep_index 只是用來選擇剩餘資料的遮罩而已,
要執行 df=df[keep_index] 後, 才會真正把df中的超界資料刪除
[執行結果一樣]
這就比較奇怪了, 資料不相同, 結果應該不同才對
如果是這個問題, 建議你提供程式碼, 我們才能確認哪邊可能有問題
-
2019/09/20 下午 01:43herohsu贊同數:0不贊同數:0留言數:2
真抱歉沒描述清楚,感謝大家熱心回答~
根據作業2提示,使用捨去離群值方法,我比對作業1調整離群值方法,
當我改變作業2, keep_indexs = (df['1stFlrSF']> 400) & (df['1stFlrSF']< 2200)這行,多加等號 >= and <=
最後都會得出底下的結果
output:0.8836894979073172
所以我會認為這兩一樣,clip 這function真的有用嗎,要再多想想
df.shape都是(1460, 36)
# 將 1stFlrSF 限制在你覺得適合的範圍內, 調整離群值
"""
Response:
將range限制在400~2200
使分數從0.84提升到0.883
"""
df['1stFlrSF'] = df['1stFlrSF'].clip(400, 2200)
sns.regplot(x = df['1stFlrSF'], y=train_Y)
plt.show()
df.shape
output:0.8836894979073172
# 做線性迴歸, 觀察分數
train_X = MMEncoder.fit_transform(df)
estimator = LinearRegression()
cross_val_score(estimator, train_X, train_Y, cv=5).mean()
# 作業2
* 續前題, 去除離群值有兩類方式 : 捨棄離群值(刪除離群的資料) 以及調整離群值,
請試著用同樣的上下限, 改為 '捨棄離群值' 的方法, 看看結果會變好還是變差? 並試著解釋原因。
# 將 1stFlrSF 限制在你覺得適合的範圍內, 捨棄離群值
keep_indexs = (df['1stFlrSF']>= 400) & (df['1stFlrSF']<= 2200)
df = df[keep_indexs]
train_Y = train_Y[keep_indexs]
sns.regplot(x = df['1stFlrSF'], y=train_Y)
plt.show()
# 做線性迴歸, 觀察分數
train_X = MMEncoder.fit_transform(df)
estimator = LinearRegression()
cross_val_score(estimator, train_X, train_Y, cv=5).mean()
df.shapee
output:0.8836894979073172