特徵錦囊:如何把分佈修正為類正態分佈?

  • 2020 年 2 月 17 日
  • 筆記

今日錦囊

特徵錦囊:如何把分佈修正為類正態分佈?

今天我們用的是一個新的數據集,也是在kaggle上的一個比賽,大家可以先去下載一下:

下載地址:https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data

import pandas as pd  import numpy as np  # Plots  import seaborn as sns  import matplotlib.pyplot as plt    # 讀取數據集  train = pd.read_csv('./data/house-prices-advanced-regression-techniques/train.csv')  train.head()  

首先這個是一個價格預測的題目,在開始前我們需要看看分佈情況,可以調用以下的方法來進行繪製:

sns.set_style("white")  sns.set_color_codes(palette='deep')  f, ax = plt.subplots(figsize=(8, 7))  #Check the new distribution  sns.distplot(train['SalePrice'], color="b");  ax.xaxis.grid(False)  ax.set(ylabel="Frequency")  ax.set(xlabel="SalePrice")  ax.set(title="SalePrice distribution")  sns.despine(trim=True, left=True)  plt.show()  

我們從結果可以看出,銷售價格是右偏,而大多數機器學習模型都不能很好地處理非正態分佈數據,所以我們可以應用log(1+x)轉換來進行修正。那麼具體我們可以怎麼用Python代碼實現呢?

# log(1+x) 轉換  train["SalePrice_log"] = np.log1p(train["SalePrice"])    sns.set_style("white")  sns.set_color_codes(palette='deep')  f, ax = plt.subplots(figsize=(8, 7))    sns.distplot(train['SalePrice_log'] , fit=norm, color="b");    # 得到正態分佈的參數  (mu, sigma) = norm.fit(train['SalePrice_log'])    plt.legend(['Normal dist. ($mu=$ {:.2f} and $sigma=$ {:.2f} )'.format(mu, sigma)],              loc='best')  ax.xaxis.grid(False)  ax.set(ylabel="Frequency")  ax.set(xlabel="SalePrice")  ax.set(title="SalePrice distribution")  sns.despine(trim=True, left=True)    plt.show()  

以上的內容大家有什麼疑問的嗎,歡迎留言諮詢哈~