機器學習之預測房價系列:html
探索數據是指研究數據,發現數據的結構。數據集由數據對象構成,一個數據對象表明一個實體,實體由屬性構成,屬性是一個數據字段,表示數據對象的一個特徵,一般,在數據分析和機器學習中,屬性、維度、特徵和變量這四個術語能夠互換。git
用來描述一個數據對象的一組屬性,稱做屬性向量或者特徵向量。一個屬性的類型是由該屬性的值決定的,屬性能夠是標稱的、二元的、序數的和數值的。github
本文使用的數據,使用如下腳本得到,案例是預測某個區域的房價,本文重點關注的是如何探索數據和對數據進行預處理。算法
import os import tarfile import urllib import pandas as pd DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml2/master/" HOUSING_PATH = os.path.join("datasets", "housing") HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz" def fetch_housing_data(housing_url=HOUSING_URL, housing_path=HOUSING_PATH): if not os.path.isdir(housing_path): os.makedirs(housing_path) tgz_path = os.path.join(housing_path, "housing.tgz") urllib.request.urlretrieve(housing_url, tgz_path) housing_tgz = tarfile.open(tgz_path) housing_tgz.extractall(path=housing_path) housing_tgz.close() def load_housing_data(housing_path=HOUSING_PATH): csv_path = os.path.join(housing_path, "housing.csv") return pd.read_csv(csv_path) #get data fetch_housing_data() housing = load_housing_data()
快速查看數據的結構,每一行表明一個區域,共有10個屬性,其中median_house_value是須要預測的屬性值。機器學習
housing.head()
屬性能夠分爲兩大類:定性屬性和定量屬性,還能夠把屬性分爲離散屬性和連續屬性。ide
1,定性屬性和定量屬性函數
定性屬性:性能
定量屬性是定量的,它的值是可度量的,用整數或實數來表示,定量屬性分爲標量和比率。學習
2,離散屬性和連續屬性fetch
離散屬性是指存在有限個值,或可數的值
連續屬性:值的個數是不可數的
3,對housing數據按照屬性進行分析
housing數據共有10個屬性,其中9個屬性屬於標量屬性,1個標稱屬性。
標量屬性:
標稱屬性:
預測值是標量值:
數據的基本統計描述,是對數據集的總體作一個統計描述,一般是對一個屬性進行統計分析。
1,整體數量統計
值的數量、惟一值的數量
2,缺失值
屬性字段是否存在缺失值
3,中心趨勢分析
4,離中趨勢分析
值域:最小值和最大值之間的差值
方差和標準差:對同一值域的屬性來講,標準差越大,數據的離散程度越大
四分位數:箱線圖分析,特別是四分位數間距(IQR),它是上四分位數QU和下四分位數QL之差,其間包含所有觀察值的通常,其值越大,說明數據的變異程度越大,離中趨勢越明顯。
5,對屬性值進行基本的統計分析
使用DataFrame的describe()函數,對變量屬性進行基本的統計描述分析,行索引是count :表示統計非NaN的行數,mean表示均值,std表示標準差,最大值、最小值、上四分位數(25%),中位數(50%)和下四分位數(75%)。
housing.describe()
在Jupyter notebooks中顯示屬性的直方圖,查看屬性值的分佈狀況,經過DataFrame的hist(),能夠對標量屬性查看直方圖。
%matplotlib inline import matplotlib.pyplot as plt housing.hist(bins=50, figsize=(20,15)) plt.show()
從直方圖中能夠看出,除了經緯度latitude 和 longitude以外,有5個屬性households、population、total_bedrooms、total_rooms和meidan_income的直方圖中出現重尾現象,呈現出左偏分佈,中位數右側的延伸比左側要遠的多,餘下的2個屬性 housing_median_age 和 median_house_value的直方圖,最右側都呈現出一個異常的值。
對於屬性直方圖中出現的重尾分佈,有時須要對數據進行轉換,好比計算其對數。
利用相關係數查看各個屬性之間的相關性,用於發現不一樣變量之間的關聯性,關聯是指數據之間變化的類似性,這能夠經過相關係數來描述。發現相關性能夠幫助你預測將來,而發現因果關係意味着你能夠改變世界。
因爲housing的數據集不大,可使用DataFrame.corr()方法計算出每隊屬性之間的標準相關係數(也稱做皮爾遜r),查看median_house_value和其餘屬性的相關係數:
corr_matrix = housing.corr() corr_matrix["median_house_value"].sort_values(ascending=False)
從相關係數中能夠看出:median_house_value 和 median_income的相關係數是最高的,這也符合「房價和收入呈現正相」的常識。
median_house_value 1.000000
median_income 0.687160
total_rooms 0.135097
housing_median_age 0.114110
households 0.064506
total_bedrooms 0.047689
population -0.026920
longitude -0.047432
latitude -0.142724
Name: median_house_value, dtype: float64
還有一種方法用於檢測屬性之間的相關性,就是使用pandas的scatter_matrix函數,它會繪製出每一個數值屬性相對於其餘數值屬性的相關性。
from pandas.plotting import scatter_matrix attributes = ["median_house_value", "median_income", "total_rooms", "housing_median_age"] scatter_matrix(housing[attributes], figsize=(12, 8))
因爲篇幅沒法徹底展現9個屬性的散點圖矩陣,下面的散點圖矩陣僅僅繪製出四個屬性的相關性,主對角線位置(從左上到右下)是每一個屬性的直方圖,其餘網格是都是兩個屬性之間的相關性。
對變量屬性進行組合,一般是跟標量屬性推導出比率屬性,好比,根據房間總數(total_rooms)和家庭總數(household)計算每一個家庭的房間的數量,或者根據房間總數計算臥室的佔比,或者根據人口和家庭來計算每一個家庭的人口數量:
housing["rooms_per_household"] = housing["total_rooms"]/housing["households"] housing["bedrooms_per_room"] = housing["total_bedrooms"]/housing["total_rooms"] housing["population_per_household"]=housing["population"]/housing["households"] corr_matrix = housing.corr() corr_matrix["median_house_value"].sort_values(ascending=False)
計算新加的屬性跟median_house_value的相關性:
median_house_value 1.000000
median_income 0.687160
rooms_per_household 0.146285
total_rooms 0.135097
housing_median_age 0.114110
households 0.064506
total_bedrooms 0.047689
population_per_household -0.021985
population -0.026920
longitude -0.047432
latitude -0.142724
bedrooms_per_room -0.259984
Name: median_house_value, dtype: float64
對於缺失值,有多種處理方式,本文只簡單介紹一下:
對於文本屬性,若是是標稱屬性,那麼該屬性用於對數據對象進行分類,可能只有有限多個取值,每一個值表明一個類別。機器學習算法沒法直接處理文本屬性,一般把文本屬性轉換爲數值來處理,這就須要把文本編碼爲數值。
1,有序編碼
使用Scikit-Learn 的 OrdinalEncoder類把屬性編碼爲有序的:
from sklearn.preprocessing import OrdinalEncoder ordinal_encoder = OrdinalEncoder() housing_cat_encoded = ordinal_encoder.fit_transform(housing_cat)
2,One-Hot編碼
獨熱(One-Hot)編碼把分類屬性的各個屬性值轉換爲數據集的新屬性,在由分類屬性派生的屬性組中,對於同一個數據行,只有一個屬性是1,其餘屬性都是0,使用Scikit-Learn 的OneHotEncoder編碼器能夠把分類屬性轉換爲獨熱向量:
from sklearn.preprocessing import OneHotEncoder cat_encoder = OneHotEncoder() housing_cat_1hot = cat_encoder.fit_transform(housing_cat)
若是輸入的數值屬性具備很是大的比例差別,每每會致使機器學習算法的性能表現不佳。
1,最小-最大縮放(歸一化)
使用Scikit-Learn 的MinMaxScaler()實現標準化縮放
2,標準化
使用Scikit-Learn 的StandardScaler()實現標準化縮放
參考文檔: