谷歌机器学习课程对应的练习。
tf.add(x,y)
twos = tf.constant([2, 2, 2, 2, 2, 2], dtype=tf.int32)
primes_doubled = primes * twos
print("primes_doubled:", primes_doubled)
# 输出值包含值和形状(shape)、类型信息
primes_doubled: tf.Tensor([ 4 6 10 14 22 26], shape=(6,), dtype=int32)
tf.matmul
tf.reshape
函数,改变形状或者阶数。tf.assign
)的。v = tf.contrib.eager.Variable([3])
print(v)
tf.assign(v, [7])
print(v)
[3]
[7]
模拟投两个骰子10次,10x3的张量,第三列是前两列的和:
random_uniform
:随机选取tf.concat
:合并张量die1 = tf.contrib.eager.Variable(
tf.random_uniform([10, 1], minval=1, maxval=7, dtype=tf.int32))
die2 = tf.contrib.eager.Variable(
tf.random_uniform([10, 1], minval=1, maxval=7, dtype=tf.int32))
dice_sum = tf.add(die1, die2)
resulting_matrix = (values=[die1, die2, dice_sum], axis=1)
print(resulting_matrix.numpy())
[[5 1 6]
[4 5 9]
[1 6 7]
[2 3 5]
[1 2 3]
[5 4 9]
[3 5 8]
[3 2 5]
[3 1 4]
[6 3 9]]
NaN
填充cities
City name Population Area square miles Population density
0 San Francisco 852469 46.87 18187.945381
1 San Jose 1015785 176.53 5754.177760
2 Sacramento 485199 97.92 4955.055147
# 随机化index,然后重建索引
cities.reindex(np.random.permutation(cities.index))
# 索引超出范围不报错,新建行
cities.reindex([0, 4, 5, 2])
有些标签可能不可靠。
未标记为“垃圾邮件”或“非垃圾邮件”的电子邮件是无标签样本。
“用户点击鞋子描述”是一项实用标签。
鞋码是一项实用特征。
均方误差:
学习速率*梯度
就是每次更新的数值。小批量或甚至包含一个样本的批量 (SGD)。
任务:基于单个输入特征预测各城市街区的房屋价值中位数
# 准备feature和target数据,这里只用一个特征
my_feature = california_housing_dataframe[["total_rooms"]]
feature_columns = [tf.feature_column.numeric_column("total_rooms")]
targets = california_housing_dataframe["median_house_value"]
# 配置训练时的优化器
my_optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.0000001)
my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)
# 配置模型
linear_regressor = tf.estimator.LinearRegressor(
feature_columns=feature_columns,
optimizer=my_optimizer
)
def my_input_fn(features, targets, batch_size=1, shuffle=True, num_epochs=None):
"""Trains a linear regression model of one feature.
"""
features = {key:np.array(value) for key,value in dict(features).items()}
ds = Dataset.from_tensor_slices((features,targets)) # warning: 2GB limit
ds = ds.batch(batch_size).repeat(num_epochs)
if shuffle:
ds = ds.shuffle(buffer_size=10000)
# Return the next batch of data.
features, labels = ds.make_one_shot_iterator().get_next()
return features, labels
# 训练模型
_ = linear_regressor.train(
input_fn = lambda:my_input_fn(my_feature, targets),
steps=100
)
# 评估模型
prediction_input_fn =lambda: my_input_fn(my_feature, targets, num_epochs=1, shuffle=False)
predictions = linear_regressor.predict(input_fn=prediction_input_fn)
predictions = np.array([item['predictions'][0] for item in predictions])
mean_squared_error = metrics.mean_squared_error(predictions, targets)
root_mean_squared_error = math.sqrt(mean_squared_error)
print("Mean Squared Error (on training data): %0.3f" % mean_squared_error)
print("Root Mean Squared Error (on training data): %0.3f" % root_mean_squared_error)
Mean Squared Error (on training data): 56367.025
Root Mean Squared Error (on training data): 237.417
模型效果好吗?通过RMSE(特性:它可以在与原目标相同的规模下解读)
,直接与原来target的最大最小值,进行比较。在这里,误差跨越了目标范围的一半,所以需要优化模型减小误差。
Min. Median House Value: 14.999
Max. Median House Value: 500.001
Difference between Min. and Max.: 485.002
Root Mean Squared Error: 237.417
问题:有适用于模型调整的标准启发法吗?
total_rooms/population
作为一个特征,表示的是平均每个人有多少个房间,这个是可取的。clipped_feature = df["feature_name"].apply(lambda x: max(x, 0))
,再重新训练,看是否效果变好了。训练集和测试集:调整训练集和测试集的相对比例,查看模型的效果。不同的数据集需要不同的比例,这个得通过尝试才能确定。
如何确定各data set之间的比例,没有统一的标准,取决于不同的条件 About Train, Validation and Test Sets in Machine Learning:
多次重复执行该流程可能导致我们不知不觉地拟合我们的特定测试集的特性。
一个特征组合:[binned latitude X binned longitude X binned roomsPerPerson]
bucketized_column
,转换为对应的类别编码,然后再进行独热编码(成二元特征系列)。bucketized_longitude = tf.feature_column.bucketized_column(
longitude, boundaries=get_quantile_based_boundaries(
training_examples["longitude"], 10))
long_x_lat = tf.feature_column.crossed_column(
set([bucketized_longitude, bucketized_latitude]), hash_bucket_size=1000)
L2 正则化可能会导致对于某些信息缺乏的特征,模型会学到适中的权重。
L2 正则化会使很多信息缺乏的权重接近于(但并非正好是)0.0。
这两个特征将拥有几乎相同的适中权重。
在 roulette 游戏中,一只球会落在旋转轮上,并且最终落入 38 个槽的其中一个内。某个机器学习模型可以使用视觉特征(球的旋转方式、球落下时旋转轮所在的位置、球在旋转轮上方的高度)预测球会落入哪个槽中,准确率为 4%。
可能会提高。
始终下降或保持不变。
如果模型 A 的精确率和召回率均优于模型 B,则模型 A 可能更好。
没有变化。AUC 只关注相对预测分数。
【L1正则化】:假设某个线性模型具有100个输入特征,其中10个特征信息丰富,另外90个特征信息比较缺乏。假设所有特征的值均介于-1和1之间。以下哪些陈述属实?
L1 正则化可能会使信息丰富的特征的权重正好为 0.0。
L1 正则化会使大多数信息缺乏的权重正好为 0.0。
【L1和L2正则化】:假设某个线性模型具有 100 个输入特征,这些特征的值均介于-1到1之间,其中10个特征信息丰富,另外90个特征信息比较缺乏。哪种类型的正则化会产生较小的模型?
L1 正则化。
神经网络:在线性很难区分的数据集上,测试不同的神经网络结构(隐藏层、权重、激活函数等),查看效果。
构建神经网络: 函数hidden_units
,例子hidden_units=[3, 10]
表示指定了连个隐藏层,第一个隐藏层含有3个节点,第二个隐藏层含有10个节点,默认为全连接且使用ReLU激活函数。
编程联系:时间问题,神经网络的训练需要大量的时间和运算,所以最好在集群上进行,不要在本地电脑上。
# Create a DNNRegressor object.
my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)
dnn_regressor = tf.estimator.DNNRegressor(
feature_columns=construct_feature_columns(training_examples),
hidden_units=hidden_units,
optimizer=my_optimizer
)
# Create input functions.
training_input_fn = lambda: my_input_fn(training_examples,
training_targets["median_house_value"],
batch_size=batch_size)
predict_training_input_fn = lambda: my_input_fn(training_examples,
training_targets["median_house_value"],
num_epochs=1,
shuffle=False)
predict_validation_input_fn = lambda: my_input_fn(validation_examples,
validation_targets["median_house_value"],
num_epochs=1,
shuffle=False)
def linear_scale(series):
min_val = series.min()
max_val = series.max()
scale = (max_val - min_val) / 2.0
return series.apply(lambda x:((x - min_val) / scale) - 1.0)
def log_normalize(series):
return series.apply(lambda x:math.log(x+1.0))
def clip(series, clip_to_min, clip_to_max):
return series.apply(lambda x:(
min(max(x, clip_to_min), clip_to_max)))
def z_score_normalize(series):
mean = series.mean()
std_dv = series.std()
return series.apply(lambda x:(x - mean) / std_dv)
def binary_threshold(series, threshold):
return series.apply(lambda x:(1 if x > threshold else 0))
【在线训练】:以下哪个关于在线(动态)训练的表述是正确的?
模型会在新数据出现时进行更新。
【离线训练】:以下哪些关于离线训练的表述是正确的?
与在线训练相比,离线训练需要对训练作业进行的监控较少。
您可以先验证模型,然后再将其应用到生产中。
【在线推理】:在线推理指的是根据需要作出预测。也就是说,进行在线推理时,我们将训练后的模型放到服务器上,并根据需要发出推理请求。以下哪些关于在线推理的表述是正确的?
您可以为所有可能的条目提供预测。
您必须小心监控输入信号。
【离线推理】:在离线推理中,我们会一次性根据大批量数据做出预测。然后将这些预测纳入查询表中,以供以后使用。以下哪些关于离线推理的表述是正确的?
对于给定的输入,离线推理能够比在线推理更快地提供预测。
生成预测之后,我们可以先对预测进行验证,然后再应用。
Data Dependencies理解:以下哪个模型容易受到反馈环的影响?
大学排名模型 - 将选择率(即申请某所学校并被录取的学生所占百分比)作为一项学校评分依据。
图书推荐模型 - 根据小说的受欢迎程度(即图书的购买量)向用户推荐其可能喜欢的小说。
交通状况预测模型 - 使用海滩上的人群规模作为特征之一预测海滩附近各个高速公路出口的拥堵情况。