MeanEncoder() 中的 mean_encode_subroutine()?
這個網頁 (https://zhuanlan.zhihu.com/p/26308272) 上的 MeanEncoder() 和作業中均值編碼的方式應該不同吧?
在 python 中執行出來的 score 也不同,有點不太理解 MeanEncoder() 裡面的 mean_encode_subroutine() 這個 staticmethod 在做甚麼。
回答列表
-
2020/06/11 下午 04:10Yang 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:52Yang 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)