1. 程式人生 > >【學習筆記】合成特徵與離群值

【學習筆記】合成特徵與離群值

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的用法。