【TensorFlow】实现、训练并评估简单的回归模型和分类模型

1 回归模型

回归算法模型用来预测连续数值型,其目标不是分类值而是数字。为了评估这些回归预测值是否与实际目标相符,我们需要度量两者间的距离,打印训练过程中的损失,最终评估模型损失。

这里使用的例子是从均值为1、标准差为0.1的正态分布中抽样随机数,然后乘以变量A,损失函数为L2正则损失函数。理论上,A的最优值是10,因为生成的样例数据均值是1。回归算法模型拟合常数乘法,目标值是10。

1.1 实现模型

# TensorFlow实现、训练并评估回归模型
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf# 1.创建计算图、数据集、变量和占位符。
# 创建完数据后,将它们随机分割成训练数据集和测试数据集。
# 不管算法模型预测的如何,我们都需要测试算法模型,这点相当重要。
# 在训练数据和测试数据上都进行模型评估,以搞清楚模型是否过拟合:
sess = tf.Session()
x_vals = np.random.normal(1, 0.1, 100)
y_vals = np.repeat(10., 100)
x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
batch_size = 25
train_indices = np.random.choice(len(x_vals),round(len(x_vals) * 0.8),replace=False)
test_indices = np.array(list(set(range(len(x_vals))) -set(train_indices)))
x_vals_train = x_vals[train_indices]
x_vals_test = x_vals[test_indices]
y_vals_train = y_vals[train_indices]
y_vals_test = y_vals[test_indices]
A = tf.Variable(tf.random_normal(shape=[1, 1]))# 2.声明算法模型、损失函数和优化器算法。初始化模型变量A
my_output = tf.matmul(x_data, A)
loss = tf.reduce_mean(tf.square(my_output - y_target))
init = tf.global_variables_initializer()
sess.run(init)
my_opt = tf.train.GradientDescentOptimizer(0.02)
train_step = my_opt.minimize(loss)

1.2 训练模型

# 3.迭代训练模型
for i in range(100):rand_index = np.random.choice(len(x_vals_train),size=batch_size)rand_x = np.transpose([x_vals_train[rand_index]])rand_y = np.transpose([y_vals_train[rand_index]])sess.run(train_step,feed_dict={x_data: rand_x, y_target: rand_y})if (i + 1) % 25 == 0:print('Step # ' + str(i+1) + ' A = ' + str(sess.run(A)))print('Loss = ' + str(sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})))

1.3 评估模型

mse_test = sess.run(loss, feed_dict={x_data: np.transpose([x_vals_test]),y_target: np.transpose([y_vals_test])})
mse_train = sess.run(loss, feed_dict={x_data: np.transpose([x_vals_train]),y_target: np.transpose([y_vals_train])})
print("MSE on test: " + str(np.round(mse_test, 4)))
print("MSE on train: " + str(np.round(mse_train, 4)))
//输出结果
Step # 25 A = [[6.699071]]
Loss = 12.127724
Step # 50 A = [[8.651022]]
Loss = 2.3122501
Step # 75 A = [[9.345232]]
Loss = 0.95689005
Step # 100 A = [[9.618834]]
Loss = 1.1624776
MSE on test: 1.2316
MSE on train: 0.9331

2 分类模型

分类算法模型基于数值型输入预测分类值,实际目标是1和0的序列。我们需要度量预测值与真实值之间的距离。分类算法模型的损失函数一般不容易解释模型好坏,所以通常情况是看下准确预测分类的结果的百分比。

这里的例子是一个简单的二值分类算法。从两个正态分布N(-1, 1)和N(3, 1)生成100个数。所有从正态分布N(-1, 1)生成的数据标为目标类0;从正态分布N(3, 1)生成的数据标为目标类1。模型算法通过sigmoid函数将这些生成的数据转换成目标类数据。换句话讲,模型算法是sigmoid(x+A)sigmoid(x+A)sigmoid(x+A),其中,A是要拟合的变量,理论上A=−1A=-1A=1。假设,两个正态分布的均值分别是m1和m2,则达到A的取值时,它们通过−m1+m22-\frac{m1+m2}{2}2m1+m2转换成到0等距的值。

2.1 实现模型

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tfsess = tf.Session()# 声明批大小
batch_size = 25# 创建数据
x_vals = np.concatenate((np.random.normal(-1, 1, 50),np.random.normal(2, 1, 50)))
y_vals = np.concatenate((np.repeat(0., 50), np.repeat(1., 50)))
x_data = tf.placeholder(shape=[1, None], dtype=tf.float32)
y_target = tf.placeholder(shape=[1, None], dtype=tf.float32)# 将数据分为 训练集/测试集 = 0.8/0.2
train_indices = np.random.choice(len(x_vals), round(len(x_vals)*0.8), replace=False)
test_indices = list(set(range(len(x_vals))) - set(train_indices))
x_vals_train = x_vals[train_indices]
x_vals_test = x_vals[test_indices]
y_vals_train = y_vals[train_indices]
y_vals_test = y_vals[test_indices]
A = tf.Variable(tf.random_normal(mean=10, shape=[1]))# 设置模型和损失函数,初始化变量并创建优化器
my_output = tf.add(x_data, A)xentropy = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=my_output, labels=y_target))my_opt = tf.train.GradientDescentOptimizer(0.05)
train_step = my_opt.minimize(xentropy)init = tf.global_variables_initializer()
sess.run(init)

2.2 训练模型

for i in range(1000):rand_index = np.random.choice(len(x_vals_train), size=batch_size)rand_x = [x_vals_train[rand_index]]rand_y = [y_vals_train[rand_index]]sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})if (i + 1) % 200 == 0:print('Step # ' + str(i + 1) + ' A = ' + str(sess.run(A)))print('Loss = ' + str(sess.run(xentropy, feed_dict={x_data: rand_x, y_target: rand_y})))

2.3 评估模型

# 评估模型
# 创建预测操作,用squeeze()使得预测值和目标值有相同的维度
# 用equal()函数检测是否相等,
# 把得到的true或false的boolean型张量转化成float32型
# 再对其取平均值,得到一个准确度值。
y_prediction = tf.squeeze(tf.round(tf.nn.sigmoid(tf.add(x_data, A))))
correct_prediction = tf.equal(y_prediction, y_target)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
acc_value_test = sess.run(accuracy, feed_dict={x_data: [x_vals_test], y_target: [y_vals_test]})
acc_value_train = sess.run(accuracy, feed_dict={x_data: [x_vals_train], y_target: [y_vals_train]})
print('训练集准确率:' + str(acc_value_train))
print('测试集准确率:' + str(acc_value_test))
# 训练集准确率:0.975
# 测试集准确率:0.9

2.4 可视化

A_result = sess.run(A)
bins = np.linspace(-5, 5, 50)
plt.hist(x_vals[0:50], bins, alpha=0.5, label='N(-1, 1)', color='green')
plt.hist(x_vals[50:100], bins[0:50], alpha=0.5, label='N(2, 1)', color='skyblue')
plt.plot((A_result, A_result), (0, 8), 'k--', linewidth=3, label = 'A = ' + str(np.round(A_result, 2)))
plt.legend(loc = 'upper right')
plt.show()

在这里插入图片描述
两个正态分布的均值分别是-1和2,理论上最佳分割点是−2+(−1)2=0.5-\frac{2+(-1)}{2}=0.522+(1)=0.5,可以看出,这里的模型结果为0.51非常接近理论值。

3 总结

从上述两个例子可以看出,模型评估是必不可少的,为了对模型进行评估需要先划分数据集,除了训练集和测试集外,有时还需要验证集。模型训练完成后可以得到准确率、MSE的结果,可以利用这些结果对机器学习模型进行评估。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史上最通熟易懂的检索式聊天机器人讲解

喵喵喵,一不小心又匿了三个月,突然诈尸害不害怕( ̄∇ ̄) 小夕从7月份开始收到第一场面试邀请,到9月初基本结束了校招(面够了面够了T_T),深深的意识到今年的对话系统/chatbot方向是真的…

Python pandas数据分析中常用方法

官方教程 读取写入文件 官方IO 读取 写入 read_csv       to_csv read_excel      to_excel read_hdf       to_hdf read_sql       to_sql read_json      to_json read_msgpack (experimental)   to_msgpack (experimental) read_html    …

小哥哥,检索式chatbot了解一下?

喵喵喵,一不小心又匿了三个月,突然诈尸害不害怕( ̄∇ ̄) 小夕从7月份开始收到第一场面试邀请,到9月初基本结束了校招(面够了面够了T_T),深深的意识到今年的对话系统/chatbot方向是真的…

领域应用 | 中医临床术语系统

本文转载自公众号中医药知识组织与标准。什么是中医药术语系统?它是干什么用的呢?中医药术语系统是运用计算机与信息技术等工具,对中医药学各领域中的事物、现象、特性、关系和过程进行标记和概括,并为每个概念赋予指称形成概念体…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Image图片组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Image图片组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Image组件 Image 用来加载并显示图片的基础组件,它支持从内存、本…

梁家卿 | 百科知识图谱同步更新

本文转载自公众号知识工场。 本文整理自复旦大学知识工场梁家卿博士在IJCAI 2017 会议上的论文报告,题目为《How to Keep a Knowledge Base Synchronized with Its Encyclopedia Source》,作者包括:梁家卿博士(复旦大学&#xff0…

别再搜集面经啦!小夕教你斩下NLP算法岗offer!

推完上一篇文章,订阅号和知乎后台有好多小伙伴跟小夕要面经(还有个要买简历的是什么鬼),然鹅小夕真的没有整理面经呀,真的木有时间(。 ́︿ ̀。)。不过话说回来,面经有多大用呢&#…

肖仰华 | 基于知识图谱的问答系统

本文转载自公众号知识工场。 本文整理自复旦大学知识工场肖仰华教授在VLDB 2017 会议上的论文报告,题目为《KBQA: Learning Question Answering over QA Corpora and Knowledge Bases》,作者包括:崔万云博士(现上海财经大学讲师&a…

【小夕精选】YJango 7分钟带你领略你未曾想过的线性代数+微积分

小夕很早之前就想转一些精彩的技术文章,这样哪怕没有时间写作的时候,也能把优质的干货分享给大家~然鹅,由于我也不知道是什么的原因,就不小心拖到了现在╮( ̄▽ ̄"")╭之前有不少粉丝希…

白硕 | 基于区块链的众包社区激励机制

本文整理自白硕老师在 YOCSEF 武汉专题论坛:“人工智能遇到区块链,是惊鸿一瞥还是天长地久?”的报告。 很高兴有这个机会跟大家交流。我先讲几个案例作为引子。第一个案例与知识图谱有关。这个公司做的是非常垂直的一个领域,安全教…

【小夕精选】多轮对话之对话管理(Dialog Management)

这一篇是一段时间之前小夕初入对话领域时刷到的徐阿衡小姐姐写的一篇文章,写的深入浅出,十分适合有一定基础的情况下想快速了解对话管理技术的童鞋阅读~另外顺手推一下阿衡小姐姐的订阅号「徐阿衡」,干货满满不要错过哦~这一篇想写一写对话管…

KD Tree的原理及Python实现

1. 原理篇我们用大白话讲讲KD-Tree是怎么一回事。1.1 线性查找假设数组A为[0, 6, 3, 8, 7, 4, 11],有一个元素x,我们要找到数组A中距离x最近的元素,应该如何实现呢?比较直接的想法是用数组A中的每一个元素与x作差,差的…

漆桂林 | 知识图谱的应用

本文作者为东南大学漆桂林老师,首发于知乎专栏知识图谱和智能问答 前面一篇文章“知识图谱之语义网络篇”已经提到了知识图谱的发展历史,回顾一下有以下几点: 1. 知识图谱是一种语义网络,即一个具有图结构的知识库,这里…

NLP预训练之路——从word2vec, ELMo到BERT

前言 还记得不久之前的机器阅读理解领域,微软和阿里在SQuAD上分别以R-Net和SLQA超过人类,百度在MS MARCO上凭借V-Net霸榜并在BLEU上超过人类。这些网络可以说一个比一个复杂,似乎“如何设计出一个更work的task-specific的网络"变成了NLP…

论文 | 信息检索结果Ranking的评价指标《RankDCG: Rank-Ordering Evaluation Measure》

未经允许,不得转载,谢谢~~ 一 文章简介 为什么要提出这个新的评价算法? 我们都知道ranking过程对于信息检索的结果是非常重要的,那么我们就需要有一些算法能评价ranking的结果到底如何。现有用来评价ranking的常用算法有&#xff…

肖仰华 | 基于知识图谱的用户理解

本文转载自公众号知识工场。 本文整理自肖仰华教授在三星电子中国研究院做的报告,题目为《Understanding users with knowldge graphs》。 今天,很高兴有这个机会来这里与大家交流。 前面两位老师把基于社会影响力的传播和推荐,以及跨领域的…

NLP的游戏规则从此改写?从word2vec, ELMo到BERT

前言还记得不久之前的机器阅读理解领域,微软和阿里在SQuAD上分别以R-Net和SLQA超过人类,百度在MS MARCO上凭借V-Net霸榜并在BLEU上超过人类。这些网络可以说一个比一个复杂,似乎“如何设计出一个更work的task-specific的网络"变成了NLP领…

信息检索IR评价中常见的评价指标-MAP\NDCG\ERR\P@10等

信息检索评价是对信息检索系统性能(主要满足用户信息需求的能力)进行评估的活动。通过评估可以评价不同技术的优劣,不同因素对系统的影响,从而促进本领域研究水平的不断提高。信息检索系统的目标是较少消耗情况下尽快、全面返回准…

科普 | “开放知识”的定义

OpenKG 主要关注知识图谱数据(或者称为结构化数据、语义数据、知识库)的开放,广义上 OpenKG 属于开放数据的一种。 关于“开放”的定义,比较好的参考是由国际开放知识基金会 OKFN.ORG(Open Knowledge International)给与的“开放知…

科普 | 以链接为中心的系统:Link-based Systems

硅谷教父凯文凯利在他新书《必然》中谈到了网页 2.0:“…今天的网络就是所有可以访问到的超链接文件… 但在未来的 30 年中…超链接的触手会不断延伸,把所有的比特连接起来。一个主机游戏中发生的事件会像新闻一样搜索即得。你还能寻找一段 YouTube 视频…