logo
Loading...

MeanEncoder() 中的 mean_encode_subroutine()? - Cupoy

這個網頁 (https://zhuanlan.zhihu.com/p/26308272) 上的 Me...

day_025_hw

MeanEncoder() 中的 mean_encode_subroutine()?

2020/06/11 上午 01:55
機器學習共學討論版
Yang Wang
觀看數:18
回答數:4
收藏數:1
day_025_hw

這個網頁 (https://zhuanlan.zhihu.com/p/26308272) 上的 MeanEncoder() 和作業中均值編碼的方式應該不同吧?

在 python 中執行出來的 score 也不同,有點不太理解 MeanEncoder() 裡面的 mean_encode_subroutine() 這個 staticmethod 在做甚麼。

回答列表

  • 2020/06/11 下午 04:10
    Yang Wang
    贊同數:0
    不贊同數:0
    留言數:0

    範例的會出現以下 dataframe

    如果是用 MeanEncoder() 會出現以下 dataframe

  • 2020/06/12 上午 05:27
    張維元 (WeiYuan)
    贊同數:0
    不贊同數:0
    留言數:1

    嗨,Yang Wang 以下回復你的問題:


    1. 這個網頁 (https://zhuanlan.zhihu.com/p/26308272) 上的 MeanEncoder() 和作業中均值編碼的方式應該不同吧?


    => 概念上應該是都是均值編碼(mean encoding)沒錯,只是細節定義的方式可能略有不同,這一篇文章定義的方式比較嚴謹一點。


    如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃

  • 2020/06/12 上午 05:29
    張維元 (WeiYuan)
    贊同數:0
    不贊同數:0
    留言數:1

    嗨,Yang Wang 以下回復你的問題:


    1. 在 python 中執行出來的 score 也不同,有點不太理解 MeanEncoder() 裡面的 mean_encode_subroutine() 這個 staticmethod 在做甚麼。


    => 定義上有一點差,這一篇文章的定義比較複雜一點。mean_encode_subroutine 這個在做什麼話,原文中有講到,你可以先講講看你看完之後的理解:)


    如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃

  • 2020/06/12 下午 06:52
    Yang Wang
    贊同數:0
    不贊同數:0
    留言數:1

    我發現知乎裡面的作者還有打錯其他東西。他的 smoothing_mean 跟 smoothing_factor 都打錯了。正確應該是如下代碼: - smoothing_factor 在 exponential 那邊少打一個負號 ```python if isinstance(prior_weight_func, dict): self.prior_weight_func = eval('lambda x: 1 / (1 + np.exp(- (x - k) / f))', dict(prior_weight_func, np=np)) elif callable(prior_weight_func): self.prior_weight_func = prior_weight_func else: self.prior_weight_func = lambda x: 1 / (1 + np.exp(- (x - 2) / 1)) ``` - smoothing_mean 裡面的 shrinkage factor 打相反了 ```python @staticmethod def mean_encode_subroutine(X_train, y_train, X_test, variable, target, prior_weight_func): X_train = X_train[[variable]].copy() X_test = X_test[[variable]].copy() if target is not None: nf_name = '{}_pred_{}'.format(variable, target) X_train['pred_temp'] = (y_train == target).astype(int) else: nf_name = '{}_pred'.format(variable) X_train['pred_temp'] = y_train prior = X_train['pred_temp'].mean() col_avg_y = X_train.groupby(by=variable, axis=0)['pred_temp'].agg(mean="mean", beta="size") col_avg_y['beta'] = prior_weight_func(col_avg_y['beta']) col_avg_y[nf_name] = col_avg_y['beta'] * col_avg_y['mean'] + (1 - col_avg_y['beta']) * prior col_avg_y.drop(['beta', 'mean'], axis=1, inplace=True) nf_train = X_train.join(col_avg_y, on=variable)[nf_name].values nf_test = X_test.join(col_avg_y, on=variable).fillna(prior, inplace=False)[nf_name].values return nf_train, nf_test, prior, col_avg_y ``` 原 paper 連結:[link](http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf?source=post_page) 原知乎連結:[link](https://zhuanlan.zhihu.com/p/26308272)