机器学习: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])

相关推荐