【122】TensorFlow檢查地圖資料
阿新 • • 發佈:2018-12-26
下圖是加利福尼亞州的地圖:
為了驗證資料集是否存在缺陷,我們要讀取訓練集和驗證集,觀察這些資料的規律。並且按照經緯度繪製熱點圖,觀察地圖資料是否準確。
下面的程式碼完成了上面的工作:
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
我們可以觀察到,訓練集的熱點圖有點類似加利福尼亞州的地圖,而驗證集的則完全不像。這表明我們的資料可能出了問題,沒有均勻覆蓋整個州。
我們用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
熱點圖的結果就正常了:
根據輸出的列表,可以檢查一下其它資料:
對於一些值(例如 median_house_value),我們可以檢查這些值是否位於合理的範圍內(請注意,這是 1990 年的資料,不是現在的!)。
如果您仔細看,可能會發現下列異常情況:
median_income 位於 3 到 15 的範圍內。我們完全不清楚此範圍究竟指的是什麼,看起來可能是某對數尺度?無法找到相關記錄;我們所能假設的只是,值越高,相應的收入越高。
median_house_value 的最大值是 500001。這看起來像是某種人為設定的上限。
rooms_per_person 特徵通常在正常範圍內,其中第 75 百分位數的值約為 2。但也有一些非常大的值(例如 18 或 55),這可能表明資料有一定程度的損壞。
我們將暫時使用提供的這些特徵。但希望這些示例可幫助您較為直觀地瞭解如何檢查來自未知來源的資料。