學習目標:app
上一次咱們只使用了單個特徵,但這是不切實際的,每每咱們須要多個特徵,但這次並非使用多個特徵,而是建立一個合成特診學習
total_rooms
和 population
特徵都會統計指定街區的相關總計數據。
可是,若是一個街區比另外一個街區的人口更密集,會怎麼樣?咱們能夠建立一個合成特徵(即 total_rooms
與 population
的比例)來探索街區人口密度與房屋價值中位數之間的關係。spa
# 建立合成特徵 california_housing_dataframe["rooms_per_person"] =california_housing_dataframe["total_rooms"]/california_housing_dataframe["population"] calibration_data = train_model( learning_rate=0.0005, steps=500, batch_size=1, input_feature="rooms_per_person" )
結果:code
Training model...
RMSE (on training data):
period 00 : 237.29
period 01 : 237.04
period 02 : 236.78
period 03 : 236.53
period 04 : 236.28
period 05 : 236.03
period 06 : 235.78
period 07 : 235.53
period 08 : 235.27
period 09 : 235.02
Model training finished
效果不好,由於RMSE變化很小,咱們能夠嘗試增大學習速率,*10 learning_rate=0.005blog
Training model...
RMSE (on training data):
period 00 : 235.03
period 01 : 232.52
period 02 : 230.03
period 03 : 227.56
period 04 : 225.13
period 05 : 222.70
period 06 : 220.38
period 07 : 217.95
period 08 : 215.54
period 09 : 213.17
Model training finished.
能夠發現RMSE是在逐漸收斂的,學習速率沒有過大,繼續*10 learning_rate=0.05rem
Training model...
RMSE (on training data):
period 00 : 212.86
period 01 : 190.91
period 02 : 172.64
period 03 : 155.99
period 04 : 149.72
period 05 : 141.27
period 06 : 136.94
period 07 : 134.30
period 08 : 131.94
period 09 : 130.69
Model training finished.
從RMSE的降低速率來看,說明已經接近最小值了,爲其增大一點點,+0.005 learning_rate=0.055get
Training model...
RMSE (on training data):
period 00 : 210.61
period 01 : 185.76
period 02 : 166.58
period 03 : 150.86
period 04 : 142.97
period 05 : 136.05
period 06 : 133.06
period 07 : 132.46
period 08 : 131.34
period 09 : 130.55
Model training finished.input
predictions | targets | |
---|---|---|
count | 17000.0 | 17000.0 |
mean | 170.9 | 207.3 |
std | 77.4 | 116.0 |
min | 41.1 | 15.0 |
25% | 140.6 | 119.4 |
50% | 168.3 | 180.4 |
75% | 191.9 | 265.0 |
max | 3693.8 | 500.0 |
Final RMSE (on training data): 130.55it
能夠發現結果變化很小,咱們在這裏就能夠中止了,由於再次嘗試下去,要浪費太多的計算量和時間io
經過上圖的預測值與目標值的散點圖效果,能夠發現,
若是是在理想狀況下,這些值將位於一條徹底相關的對角線上。
可是如今倒是存在許多異常的散點,若是咱們可以查找到這些異常點的緣由並將其篩除掉,那麼效果必定會更好更貼近真實狀況
# 尺寸15*6 plt.figure(figsize=(15, 6)) # 1行2列,先畫第一個格 plt.subplot(1, 2, 1) # x,y軸標籤 plt.xlabel("predictioon") plt.ylabel("targets") # 繪製散點圖 plt.scatter(calibration_data["predictions"], calibration_data["targets"]) # 第二個繪製直方圖 plt.subplot(1, 2, 2) california_housing_dataframe["rooms_per_person"].hist()
結果:
從散點圖中能夠看出,絕大部分的散點聚集在一條豎直的直線上(其實這也並非一條直線,而是由於x軸的分辨率太大了,一格500),還有一些是散亂分佈的
爲何大部分點會垂直排列,這個緣由咱們先不講,這不是此次訓練目的,咱們的目的是要找出極少出的異常的點
再看直方圖,大部分是在0-5這條線上,少數的應該就是異常值了,下面咱們濾掉他們,並看下結果會怎樣
california_housing_dataframe["rooms_per_person"] = ( california_housing_dataframe["rooms_per_person"]).apply(lambda x: min(x, 5)) _ = california_housing_dataframe["rooms_per_person"].hist()
結果:
此次都在0-5以內了
再次訓練
calibration_data = train_model( learning_rate=0.055, steps=500, batch_size=5, input_feature="rooms_per_person")
結果:
Training model...
RMSE (on training data):
period 00 : 210.41
period 01 : 184.47
period 02 : 160.39
period 03 : 140.40
period 04 : 124.11
period 05 : 117.53
period 06 : 110.61
period 07 : 108.84
period 08 : 108.26
period 09 : 108.65
Model training finished.
predictions | targets | |
---|---|---|
count | 17000.0 | 17000.0 |
mean | 191.6 | 207.3 |
std | 50.1 | 116.0 |
min | 44.8 | 15.0 |
25% | 159.7 | 119.4 |
50% | 191.7 | 180.4 |
75% | 218.9 | 265.0 |
max | 425.3 | 500.0 |
Final RMSE (on training data): 108.65
此次的結果好過之前的每一次,體如今RMSE降低的速度特別快,說明少了不少干擾,其次即是RMSE此次是最小的,說明去除離羣值後效果然的是好了不少
plt.scatter(calibration_data["predictions"], calibration_data["targets"])
結果:
如今能夠看出散點分佈實際上是挺集中的。
以上,結束