【學習筆記】合成特徵與離群值
阿新 • • 發佈:2018-12-10
Dataset庫我還有問題沒有解決清楚,因此先用feed_dict方法。
首先問題1是需要我們合成特徵:
建立一個名為 rooms_per_person
的特徵。
df = pd.read_csv('california_housing_train.csv') df['median_house_value'] /=1000 df['rooms_per_person'] = df['total_rooms']/df['population'].astype('float32') df = df.reindex(np.random.permutation(df.index)) x1 = df[['rooms_per_person']] y1 = df[['median_house_value']].astype('float32')
這裡的df[[]]和 [:, np.newaxis]的效果一樣,我們可以自行選擇其中的一種方法。
loss依舊使用的RMSE
我構建的框架和上次基本無異。這次只有一個神經元。
import pandas as pd import tensorflow as tf import numpy as np def add_layer(inputs, input_size, output_size, activation_function=None): weights = tf.Variable(tf.random_normal([input_size, output_size])) biases = tf.Variable(tf.zeros(output_size)+0.1) wx_b = tf.matmul(inputs, weights) + biases if activation_function is None: outputs = wx_b else: outputs = activation_function(wx_b) return outputs df = pd.read_csv('california_housing_train.csv') df['median_house_value'] /= 1000 df['rooms_per_person'] = df['total_rooms']/df['population'].astype('float32') df = df.reindex(np.random.permutation(df.index)) x1 = df[['rooms_per_person']] y1 = df[['median_house_value']].astype('float32') xs = tf.placeholder(tf.float32, [None, 1]) ys = tf.placeholder(tf.float32, [None, 1]) l1 = add_layer(xs, 1, 1) loss = tf.sqrt(tf.reduce_mean(tf.square(l1 - ys))) train_step = tf.train.AdamOptimizer(0.1).minimize(loss) sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) for i in range(1000): sess.run(train_step, feed_dict={xs: x1, ys: y1}) if i % 50 == 0: print(sess.run(loss, feed_dict={xs: x1, ys: y1}))
同樣我們也將結果輸出為散點圖。
我們看到大部分點都在一條直線上,少量的點偏離的很厲害,我們這時畫出輸入值的直方圖。
雖然不明顯,但是我們還是能看出來我們的資料中有少量的離群值。
我們按照原文的方法把輸入值最大設定為5:
df['rooms_per_person'] = df['rooms_per_person'].apply(lambda x:min(x, 5))
也可以
df['rooms_per_person'] = np.clip(df['rooms_per_person'], 0, 5)
按照這種方法,我們的確看到了RMSE減少了,同時我畫出了預測值和實際值的散點圖。
以前一直用numpy 和pandas處理特徵,過程很繁瑣,並沒有使用過Dataset,因此寫在這裡害怕有錯誤會誤導別人。如果tf為我們提供了特徵的處理方法那真是再好不過了,等我弄明白會單獨寫一個帖子著重去講Dataset的用法。