使用sklearn進行數據挖掘系列文章:
- 1.使用sklearn進行數據挖掘-房價預測(1)
- 2.使用sklearn進行數據挖掘-房價預測(2)—划分測試集
- 3.使用sklearn進行數據挖掘-房價預測(3)—繪制數據的分布
- 4.使用sklearn進行數據挖掘-房價預測(4)—數據預處理
- 5.使用sklearn進行數據挖掘-房價預測(5)—訓練模型
- 6.使用sklearn進行數據挖掘-房價預測(6)—模型調優
可視化數據###
目前我們只是大概了解了數據的類型,以及對數據集進行了划分,下面我們要對數據進行更深一步的探索,以下的操作只在訓練集上面進行,由於該數據集比較的小,我們就直接在數據集上面進行操作,為了防止數據集被修改,我們先復制一份。
housing = strat_train_set.copy()
這個數據集提供經緯度這些地理位置信息,那么我們可以根據這些信息將數據分布繪制出來
看着像什么?你沒有猜錯,這就是加利福尼亞州的形狀,這個圖形看着有點稠密,可以通過設置alpha來設置圖形的顯示。
我們對圖像敏感,但要發現圖像中的某些規律還是需要我們調節一下參數的,現在我們就能清楚的從圖中看到稠密的地區了,接下來我們將房價、人口也加入圖中,
import matplotlib.pyplot as plt
housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,
s=housing["population"]/100, label="population", figsize=(10,7),
c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True,
sharex=False)
plt.legend()
圖中的小圓圈是代表該區域的人口由參數s
控制,顏色代表該區域的房價由參數c
控制。
從上面的圖中可以得出一些規律:房價不僅與地理位置有關,還和人口稠密度有關,這些也都是一些常識。
相關性
下面我們看一看各個特征與median_house_value
這一特征的相關性,使用的是皮爾遜相關系數Pearson
corr_matrix = housing.corr()
>>print corr_matrix['median_house_value'].sort_values(ascending=False)
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
相關系數的取值范圍為[-1,1]
,當值趨近1時,表示特征之間具有強的正相關性,反之為負相關。值趨近於0表示特征之間不存在線性關系。值得注意的是,這里說的相關性只針對線性相關。如果為非線性關系則該衡量標准失效,如下圖最后一行,它們的相關系數為0,顯然他們是存在某種關系的。第二行的相關性都為1或-1說明了相關性與斜率無關。
上面是通過計算相關系數矩陣找出特征之間的相關性,還有一種方法是通過繪制特征之間分布,pandas提供了scatter_matrix
方法,顧名思義就是使用散點圖形式繪制出特征與特征之間的關系。取出相關系數排名前四的特征作為我們需要繪制的屬性,會得到一個4*4個圖像,代碼如下:
from pandas.tools.plotting import scatter_matrix
attribute = ['median_house_value','median_income','total_rooms','housing_median_age']
scatter_matrix(housing[attribute],figsize=(10,6))
特征的組合###
前面介紹了通過可視化數據的方法來從發現潛在的規律,我們發現了特征之間的關系、還發現了一些特征有着長尾分布,以上發現的這些規律有助於我們對特征進行選擇,或者對數據進行轉化(如取log)等等,還有一個步驟我們可以嘗試使用,那就是特征組合。在這里本文使用了總房間數、家庭人數以及人口數這三個特征的組合。
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()
print corr_matrix["median_house_value"].sort_values(ascending=False)
相關系數結果:
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//
從上面結果可以看出bedrooms_per_room
較total_bedrooms
有着更高的相關性,bedrooms/rooms比越小的房價越高,從rooms_per_household
可以看出,房子越大房價越貴。