機器學習:TensorFlow中的L1正則化

機器學習:TensorFlow中的L1正則化

An overfit function in red, with the regularized o

在構建模型時,您經常會發現自己在高偏差(低方差)模型和高偏差(低偏差)模型之間徘徊。

高偏差模型是一個永遠不需要的模型,因為它過於簡單,無法在一般情況下使用。另一方面,高方差模型可以逐漸簡化以滿足您的需求。簡化問題稱為正則化。

在這篇文章中,我們將過度設計我們的模型,結果導致它過度擬合。然後應用正則化來減小方差。

我們將使用Kaggle上託管的Boston Housing Price預測數據(https://www.kaggle.com/c/boston-housing)。

讓我們首先導入我們的數據並將其拆分為我們的特徵和標籤。然後,我們將繼續設計新特徵。在這種情況下,我們將每列的平方作為新列添加。在實踐中,你可以做更多的事情,比如乘法特徵,取對數或使用正弦函數。

import pandas as pd

import numpy as np

import tensorflow as tf

from sklearn.model_selection import train_test_split

#load training data

train_df = pd.read_csv('train.csv', index_col='ID')

#split into features and target

X = train_df.drop('medv', axis=1)

y = train_df['medv']

#engineer new features

X['crim_2'] = X['crim'] ** 2

X['zn_2'] = X['zn'] ** 2

X['indus_2'] = X['indus'] ** 2

X['chas_2'] = X['chas'] ** 2

X['nox_2'] = X['nox'] ** 2

X['rm_2'] = X['rm'] ** 2

X['age_2'] = X['age'] ** 2

X['dis_2'] = X['dis'] ** 2

X['rad_2'] = X['rad'] ** 2

X['tax_2'] = X['tax'] ** 2

X['ptratio_2'] = X['ptratio'] ** 2

X['black_2'] = X['black'] ** 2

X['lstat_2'] = X['lstat'] ** 2

#split into training and validation

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.3)

接下來,我們定義輸入函數。我們需要這個來將數據傳輸到我們的估算器中。在這個版本中,我們將使用一個輸入函數進行訓練和測試,方法是將數據作為參數傳遞。Python代碼如下:

def input_fn(X, y, batch_size=16, epochs=1, shuffle=False):

#create a dictionary of features and their values

features = {key:np.array(value) for key,value in dict(X).items()}

#create a tf.data compliant dataset

d = tf.data.Dataset.from_tensor_slices((features, y))

#we need our data in batches

d = d.batch(batch_size).repeat(epochs)

#optionally shuffle our data

if shuffle:

d.shuffle(10000)

#make an iterator

iterator = d.make_one_shot_iterator()

return iterator.get_next()

接下來,讓我們檢查我們的特徵,並將列名稱提取到特徵列中。

X.info()

feature_columns = [

tf.feature_column.numeric_column('crim', dtype=tf.float64),

tf.feature_column.numeric_column('zn', dtype=tf.float64),

tf.feature_column.numeric_column('indus', dtype=tf.float64),

tf.feature_column.numeric_column('chas', dtype=tf.int64),

tf.feature_column.numeric_column('nox', dtype=tf.float64),

tf.feature_column.numeric_column('rm', dtype=tf.float64),

tf.feature_column.numeric_column('age', dtype=tf.float64),

tf.feature_column.numeric_column('dis', dtype=tf.float64),

tf.feature_column.numeric_column('rad', dtype=tf.int64),

tf.feature_column.numeric_column('tax', dtype=tf.int64),

tf.feature_column.numeric_column('ptratio', dtype=tf.float64),

tf.feature_column.numeric_column('black', dtype=tf.float64),

tf.feature_column.numeric_column('lstat', dtype=tf.float64),

tf.feature_column.numeric_column('crim_2', dtype=tf.float64),

tf.feature_column.numeric_column('zn_2', dtype=tf.float64),

tf.feature_column.numeric_column('indus_2', dtype=tf.float64),

tf.feature_column.numeric_column('chas_2', dtype=tf.int64),

tf.feature_column.numeric_column('nox_2', dtype=tf.float64),

tf.feature_column.numeric_column('rm_2', dtype=tf.float64),

tf.feature_column.numeric_column('age_2', dtype=tf.float64),

tf.feature_column.numeric_column('dis_2', dtype=tf.float64),

tf.feature_column.numeric_column('rad_2', dtype=tf.int64),

tf.feature_column.numeric_column('tax_2', dtype=tf.int64),

tf.feature_column.numeric_column('ptratio_2', dtype=tf.float64),

tf.feature_column.numeric_column('black_2', dtype=tf.float64),

tf.feature_column.numeric_column('lstat_2', dtype=tf.float64)

]

正則化在訓練中被應用,所以我們將使用一個優化器,讓我們使用應用正則化。我們還將指定學習率。您可以使用各種超參數來查看它們如何影響模型的質量。

optimizer = tf.train.FtrlOptimizer(learning_rate=0.01, l1_regularization_strength=0.1)

estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns, optimizer=optimizer)

estimator.train(input_fn= lambda: input_fn(X_train, y_train), steps=20)

繼續評估您的模型

evaluate_result = estimator.evaluate(input_fn=lambda: input_fn(X_train, y_train))

print("Training results")

for key in evaluate_result:

print(" {}, was: {}".format(key, evaluate_result[key]))

evaluate_result = estimator.evaluate(input_fn=lambda: input_fn(X_test, y_test))

print("Training results")

for key in evaluate_result:

print(" {}, was: {}".format(key, evaluate_result[key]))

您可以繼續進行預測

preds = estimator.predict(input_fn=lambda: input_fn(X_test, y_test))

predictions = np.array([item['predictions'][0] for item in preds])


分享到:


相關文章: