logo
Loading...

使用捨去離群值與調整離群值的方法結果會一樣嗎? - Cupoy

我覺得兩個應該是一樣的啊, 主要是刪去條件有沒有包含邊界值將下方>500 and <2000改成 >...

ml100-3,ml100-3-d10

使用捨去離群值與調整離群值的方法結果會一樣嗎?

2019/09/19 下午 06:17
機器學習共學討論版
herohsu
觀看數:67
回答數:4
收藏數:0
ml100-3
ml100-3-d10

我覺得兩個應該是一樣的啊, 主要是刪去條件有沒有包含邊界值

將下方>500 and <2000改成 >=500 , <=2000

會得到一樣的結果耶,還是我的理解有錯??

調整離群值:df['1stFlrSF'] = df['1stFlrSF'].clip(500, 2000)

捨棄離群值:keep_indexs = (df['1stFlrSF']> 500) & (df['1stFlrSF']< 2000)

回答列表

  • 2019/09/20 上午 00:09
    Wei-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:43
    herohsu
    贊同數: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(= 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(= 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