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