1. 程式人生 > >【122】TensorFlow檢查地圖資料

【122】TensorFlow檢查地圖資料

下圖是加利福尼亞州的地圖:
1.png

為了驗證資料集是否存在缺陷,我們要讀取訓練集和驗證集,觀察這些資料的規律。並且按照經緯度繪製熱點圖,觀察地圖資料是否準確。

下面的程式碼完成了上面的工作:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 從CSV檔案中讀取資料,返回DataFrame型別的資料集合。
def zc_func_read_csv():
    zc_var_dataframe = pd.read_csv("http://49.4.2.82/california_housing_train.csv"
, sep=",") return zc_var_dataframe # 預處理特徵值 def preprocess_features(california_housing_dataframe): selected_features = california_housing_dataframe[ ["latitude", "longitude", "housing_median_age", "total_rooms", "total_bedrooms", "population"
, "households", "median_income"] ] processed_features = selected_features.copy() # 增加一個新屬性:人均房屋數量。 processed_features["rooms_per_person"] = ( california_housing_dataframe["total_rooms"] / california_housing_dataframe["population"]) return processed_features # 預處理標籤
def preprocess_targets(california_housing_dataframe): output_targets = pd.DataFrame() # Scale the target to be in units of thousands of dollars. output_targets["median_house_value"] = ( california_housing_dataframe["median_house_value"] / 1000.0) return output_targets # 畫熱度圖 def draw_heat_map(pa_ax, pa_title, pa_x_arr, pa_y_arr, pa_c): # 設定圖表標題 pa_ax.set_title(pa_title) # 設定y軸自動縮放 pa_ax.set_autoscaley_on(False) # 設定y軸數值限制 pa_ax.set_ylim([32, 43]) # 設定x軸自動縮放 pa_ax.set_autoscalex_on(False) # 設定x軸數值限制 pa_ax.set_xlim([-126, -112]) pa_ax.scatter(pa_x_arr, pa_y_arr, cmap="coolwarm", c=pa_c) def zc_func_main(): california_housing_dataframe = zc_func_read_csv() # 對於訓練集,我們從共 17000 個樣本中選擇前 12000 個樣本。 training_examples = preprocess_features(california_housing_dataframe.head(12000)) print(training_examples.describe()) training_targets = preprocess_targets(california_housing_dataframe.head(12000)) print(training_targets.describe()) # 對於驗證集,我們從共 17000 個樣本中選擇後 5000 個樣本。 validation_examples = preprocess_features(california_housing_dataframe.tail(5000)) print(validation_examples.describe()) validation_targets = preprocess_targets(california_housing_dataframe.tail(5000)) print(validation_targets.describe()) fig = plt.figure() fig.set_size_inches(14,7) # 繪製驗證集的熱點圖 var_c = validation_targets["median_house_value"] / validation_targets["median_house_value"].max() draw_heat_map(fig.add_subplot(1, 2, 1), "Validation Data", validation_examples["longitude"], validation_examples["latitude"], var_c) # 繪製訓練集的熱點圖 var_c_train = training_targets["median_house_value"] / training_targets["median_house_value"].max() draw_heat_map(fig.add_subplot(1, 2, 2), "Training Data", training_examples["longitude"], training_examples["latitude"], var_c_train) plt.show() zc_func_main()

結果如下:

           latitude     longitude  housing_median_age   total_rooms  total_bedrooms    population   households  median_income  rooms_per_person  
count  12000.000000  12000.000000        12000.000000  12000.000000    12000.000000  12000.000000  12000.00000   12000.000000      12000.000000  
mean      34.614578   -118.470274           27.468333   2655.682333      547.057167   1476.007000    505.38425       3.795047          1.940185  
std        1.625970      1.243589           12.061790   2258.147574      434.314754   1174.280904    391.71534       1.851925          1.327142  
min       32.540000   -121.390000            1.000000      2.000000        2.000000      3.000000      2.00000       0.499900          0.018065 
25%       33.820000   -118.940000           17.000000   1451.750000      299.000000    815.000000    283.00000       2.517200          1.420007  
50%       34.050000   -118.210000           28.000000   2113.500000      438.000000   1207.000000    411.00000       3.462250          1.880875  
75%       34.440000   -117.790000           36.000000   3146.000000      653.000000   1777.000000    606.00000       4.644625          2.258830  
max       41.820000   -114.310000           52.000000  37937.000000     5471.000000  35682.000000   5189.00000      15.000100         55.222222  


       median_house_value
count        12000.000000
mean           198.037593
std            111.857499
min             14.999000
25%            117.100000
50%            170.500000
75%            244.400000
max            500.001000


          latitude    longitude  housing_median_age   total_rooms  total_bedrooms   population   households  median_income  rooms_per_person  
count  5000.000000  5000.000000          5000.00000   5000.000000     5000.000000   5000.00000  5000.000000    5000.000000       5000.000000  
mean     38.050778  -122.182510            31.27980   2614.821400      521.059600   1318.13460   491.232400       4.096053          2.078781  
std       0.923030     0.480337            13.38939   1979.620397      388.452096   1073.74575   366.523912       2.021218          0.638113  
min      36.140000  -124.350000             1.00000      8.000000        1.000000      8.00000     1.000000       0.499900          0.135721  
25%      37.490000  -122.400000            20.00000   1481.000000      292.000000    731.00000   278.000000       2.690900          1.749190  
50%      37.790000  -122.140000            31.00000   2164.000000      424.000000   1074.00000   403.000000       3.728450          2.066278  
75%      38.370000  -121.910000            42.00000   3161.250000      635.000000   1590.25000   603.000000       5.064100          2.375372  
max      41.950000  -121.390000            52.00000  32627.000000     6445.000000  28566.00000  6082.000000      15.000100         18.255319  


       median_house_value
count         5000.000000
mean           229.532879
std            122.520063
min             14.999000
25%            130.400000
50%            213.000000
75%            303.150000
max            500.001000

2.png

我們可以觀察到,訓練集的熱點圖有點類似加利福尼亞州的地圖,而驗證集的則完全不像。這表明我們的資料可能出了問題,沒有均勻覆蓋整個州。

我們用CSV檔案中的前12000個樣本做訓練集,後5000個樣本做驗證集。如果CSV中的資料按照某種順序排列,確實可能造成這樣的問題,所以我們在讀取了CSV檔案後,需要打亂原來的順序。改造函式 zc_func_read_csv ,變成如下的樣子:


# 從CSV檔案中讀取資料,返回DataFrame型別的資料集合。
def zc_func_read_csv():
    zc_var_dataframe = pd.read_csv("http://49.4.2.82/california_housing_train.csv", sep=",")
    # 打亂資料集合的順序。有時候資料檔案有可能是根據某種順序排列的,會影響到我們對資料的處理。
    zc_var_dataframe = zc_var_dataframe.reindex(np.random.permutation(zc_var_dataframe.index))
    return zc_var_dataframe

熱點圖的結果就正常了:

3.png

根據輸出的列表,可以檢查一下其它資料:

對於一些值(例如 median_house_value),我們可以檢查這些值是否位於合理的範圍內(請注意,這是 1990 年的資料,不是現在的!)。

如果您仔細看,可能會發現下列異常情況:

median_income 位於 3 到 15 的範圍內。我們完全不清楚此範圍究竟指的是什麼,看起來可能是某對數尺度?無法找到相關記錄;我們所能假設的只是,值越高,相應的收入越高。

median_house_value 的最大值是 500001。這看起來像是某種人為設定的上限。

rooms_per_person 特徵通常在正常範圍內,其中第 75 百分位數的值約為 2。但也有一些非常大的值(例如 18 或 55),這可能表明資料有一定程度的損壞。

我們將暫時使用提供的這些特徵。但希望這些示例可幫助您較為直觀地瞭解如何檢查來自未知來源的資料。