发新帖

TF学习之数据预处理坑---【如何选取训练集和测试集】

[复制链接]
988 17

快来加入 TensorFlowers 大家庭!

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
本帖最后由 M丶Sulayman 于 2018-4-29 18:12 编辑

鸢尾花(iris)数据集,一个很经典的公开数据集。想用其学习分类学习,还是在数据预处理部分遇到了问题:

第一,该数据集中的数据包括4个features和3个lables。其中lables是字符串,并非我熟知的0,1,2。那么在分类问题最后的分类输出阶段作比较时,能用非数值型lables直接比较么?

第二,该数据集中的三类花,每种我都想各抽取一部分作为训练集,剩余没有选中的作为测试集。代码实现要怎样做?


再次感谢这一周中为我不厌其烦解答问题的各位大神!

第二个问题自己解决了,代码在一楼,但是没有用TF解决,借鉴了sklearn,我希望有人能给我给出TF的解决方案
  1. from sklearn.model_selection import train_test_split
复制代码
  1. data, lables = load_data('csv_test.csv')
  2. train_data, train_lables, test_data, test_lables = train_test_split(data, lables, test_size=0.3, random_state=33)
复制代码
  1. random_state如果不设置一个数值,那么每次生成的训练集和测试集不一样
复制代码



下面附上数据集。(数据集有个坑......坑了我一下午,最后有一条空数据,记得手动删除)

五楼,自己做的,数据预处理完整版有比我好的思想方法的,大家共同探讨


iris.rar (852 Bytes, 下载次数: 83)
本楼点评(0) 收起

精彩评论17

M丶Sulayman  TF豆豆  发表于 2018-4-29 11:05:29 | 显示全部楼层
不容易啊,第二个问题我竟然自己解决了
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. import numpy as np
  4. from sklearn.model_selection import train_test_split


  5. def load_data(file):
  6.     features = []
  7.     lables = []
  8.     file = open(file, 'r')
  9.     lines = file.readlines()
  10.     for line in lines:
  11.         items = line.strip().split(',')
  12.         lables.append(int(float(items[-1])))
  13.         feature = []
  14.         for i in range(len(items) - 1):
  15.             feature.append(int(float(items[i])))
  16.         features.append(feature)
  17.     return np.array(features), np.array(lables)

  18. if __name__ == '__main__':
  19.     data, lables = load_data('csv_test.csv')
  20.     train_data, train_lables, test_data, test_lables = train_test_split(data,
  21.                                                                         lables,
  22.                                                                         test_size=0.3,
  23.                                                                         random_state=33)
  24.     print(train_data)
  25.     print(train_lables)
  26.     print(test_data)
  27.     print(test_lables)
复制代码
本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-29 11:18:47 | 显示全部楼层
第一个问题,我感觉我问的有点傻吧......一般情况下,都想到的是先转换标签量吧
本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-29 11:25:09 | 显示全部楼层
新问题:如何从数据中选取出的各类别标签的训练集和测试集分别占总训练集和总测试集的比例相同?
本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-29 18:11:23 | 显示全部楼层
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. import numpy as np


  4. def load_data(file):
  5.     train_features = []
  6.     train_lables = []
  7.     file = open(file, 'r')
  8.     lines = file.readlines()
  9.     for line in lines:
  10.         items = line.strip().split(',')

  11.         list_to_string = ','.join(items)
  12.         for ch in ['Iris-setosa']:
  13.             if ch in list_to_string:
  14.                 list_to_string = list_to_string.replace(ch, '0')
  15.         for ch in ['Iris-versicolor']:
  16.             if ch in list_to_string:
  17.                 list_to_string = list_to_string.replace(ch, '1')
  18.         for ch in ['Iris-virginica']:
  19.             if ch in list_to_string:
  20.                 list_to_string = list_to_string.replace(ch, '2')

  21.         items = list_to_string.strip().split(',')

  22.         train_features.append([float(items[i]) for i in range(len(items) - 1)])
  23.         train_lables.append(float(items[-1]))

  24.     return np.array(train_features), np.array(train_lables)

  25. if __name__ == '__main__':
  26.     data, lables = load_data('iris.csv')

  27.     print(data)
  28.     print(lables)
复制代码


数据预处理完整版
本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-29 18:13:35 | 显示全部楼层

把三个lables转换为0,1,2
本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-29 18:14:21 | 显示全部楼层
本楼点评(0) 收起
Zerone01  TF荚荚  发表于 2018-4-29 21:39:52 | 显示全部楼层

问题一

既然你已经安装了sklearn库,那么有一种更便捷的加载鸢尾花数据集的方式:

# python 3.x
from sklearn.datasets import load_iris

#以字典形式加载鸢尾花数据集
iris = load_iris()
#使用X表示数据集中的属性数据
X = iris.data 
#使用y表示数据集中的标签
y = iris.target 
# X是一个150x4的numpy数组,表示有150条数据,每条数据有四个特征值
print(X.shape) # (150, 4)
# y是一个150x1的numpy数组,表示150条数据的标签值
print(y.shape) # (150, )

问题二

sklearn库中的train_test_split函数似乎并不能保证划分的训练集和测试集中各类花的比例相同, 它只是根据所给的比例随机划分。

可以参看该函数的文档以及该函数的实现源代码

此外,TF中似乎并没有类似划分数据集的函数可以调用。

本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-29 21:42:29 | 显示全部楼层
Zerone01 发表于 2018-4-29 21:39
[md]# 问题一
既然你已经安装了`sklearn`库,那么有一种更便捷的加载鸢尾花数据集的方式:
``` python

额,加载的这种,没法学习到用自己的数据集做模型,不过我今天自己解决了5楼的代码你看看,我自己在你昨天给我的代码的基础上增加了转换。
本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-29 21:43:43 | 显示全部楼层
Zerone01 发表于 2018-4-29 21:39
[md]# 问题一
既然你已经安装了`sklearn`库,那么有一种更便捷的加载鸢尾花数据集的方式:
``` python

嗯,你说的这个问题是对的,它确实没法做到相同比例划分。我还在看一些代码,希望自己能跑出来~
本楼点评(0) 收起
Zerone01  TF荚荚  发表于 2018-4-29 21:58:37 | 显示全部楼层

五楼的写法没有错,但是我觉得还可以更简洁一些

# 存储三种花的种类名称
categories = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']

def load_data(file):
    train_features = []
    train_lables = []
    file = open(file, 'r')
    lines = file.readlines()
    for line in lines:
        items = line.strip().split(',')  # items 形如:['5.1','3.5','1.4','0.2','Iris-setosa']
        train_features.append([float(items) for i in range(len(items) - 1)])
        train_lables.append(categories.index(items[-1]))
    return np.array(train_features), np.array(train_lables)

这里用到了listindex方法,直接将花的种类名传入到categories.index()中,可以得到该种类名在列表中的索引值,即:
传入'Iris-setosa'得到0
传入'Iris-versicolor'得到1
传入'Iris-virginica'得到2

本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-29 22:04:11 | 显示全部楼层
Zerone01 发表于 2018-4-29 21:58
[md]### 五楼的写法没有错,但是我觉得还可以更简洁一些

``` python

等你一天了,我就觉得我自己的有点啰嗦,666666,这代码风格很赞,继续学习,再次感谢!~
本楼点评(1) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-29 22:38:15 | 显示全部楼层
Zerone01 发表于 2018-4-29 21:58
[md]### 五楼的写法没有错,但是我觉得还可以更简洁一些

``` python

你能再帮我看看这个么......代码太薄弱,上面感觉写的也有点啰嗦。我感觉可以解决我说的那个按相同比例划分数据集。
https://blog.csdn.net/duxu24/article/details/74012232
谢谢~
本楼点评(2) 收起
  • Zerone01确实可以解决,你用的时候可以把它那些输出信息的代码删除,核心代码在于调用的sklearn库的StratifiedShuffleSplit方法.
    但是我看官方文档上的用法和那个人的写的不太一样:
    http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedShuffleSplit.html
    你可以自己尝试一下
    2018-4-30 09:11 回复
  • M丶Sulayman回复 Zerone01 :谢谢!~
    2018-4-30 09:14 回复
yunhai_luo  TF豆豆  发表于 2018-4-30 02:33:22 | 显示全部楼层
本帖最后由 yunhai_luo 于 2018-4-30 04:00 编辑

用tf.data.Dataset的方法:

  1. import tensorflow as tf

  2. dataset = tf.data.TextLineDataset('iris.csv')
  3. table = tf.contrib.lookup.index_table_from_tensor(
  4.     ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
  5. )

  6. def _parse_function(line):
  7.     default_val = [[0.], [0.], [0.], [0.], ['']]
  8.     data = tf.decode_csv(line, default_val)
  9.     features = tf.stack(data[:-1])
  10.     targets = table.lookup(data[-1])
  11.     return features, targets

  12. batched_dataset = dataset.apply(tf.contrib.data.map_and_batch(
  13.     map_func=_parse_function, batch_size=2))
  14. iterator = batched_dataset.make_initializable_iterator()

  15. next_element = iterator.get_next()
  16. with tf.Session() as sess:
  17.     sess.run((tf.tables_initializer(), iterator.initializer))
  18.     print(sess.run(next_element))
  19.     print(sess.run(next_element))
复制代码



本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-30 09:05:41 | 显示全部楼层
yunhai_luo 发表于 2018-4-30 02:33
用tf.data.Dataset的方法:

先感谢!~我慢慢学习一下,还没接触过这些函数,不懂我再问~
本楼点评(3) 收起
  • yunhai_luo不客气,随时问。另外,可不可以耽误楼主一点时间,恳请再详细指教一下AUC-PR大于0.5的问题(https://www.tensorflowers.cn/t/408#pid1561),先行谢过!
    2018-4-30 09:23 回复
  • M丶Sulayman回复 yunhai_luo :......他们都说我理解错了,我是按照数学公式得来的。意思就是是说一个分类器,如果对正样本预测低于0.5了,那么我们就可以认为它对负样本的准确度高。本来就是个二分类问题,非正既负,所以我是这样理解的。
    2018-4-30 09:48 回复
  • yunhai_luo回复 M丶Sulayman :多谢啦。我自己还是先学学数学细节,再检查代码错误吧。一直追问很不好意思,真的是对数学细节感兴趣又不能从数学上证明>0.5,再次抱歉,不打扰您了。
    2018-4-30 11:31 回复
bitxrj  TF荚荚  发表于 2018-5-2 09:59:33 | 显示全部楼层
我在做cnn图像复原的工作,这要求以清晰图像作为标签,请教一下您知道该怎么做么?
本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-5-2 10:08:07 | 显示全部楼层
bitxrj 发表于 2018-5-2 09:59
我在做cnn图像复原的工作,这要求以清晰图像作为标签,请教一下您知道该怎么做么? ...

这个确实没做过。不过以我的认知,图像标注都是手动的吧。你首先要定义什么样的图像被称为清晰图像,然后给它一个lable就好了,不清晰的也给它一个相应的lable。扔到CNN中去训练。举个例子手写数字识别28*28维图像,扔进模型就是784*1的数据外加一个标签(0~9)。所以关键在于你如何定义清晰图像,而标签很简单啊。这是我的理解,错了请指正。
本楼点评(4) 收起
  • bitxrj清晰和模糊图像是分好的,分别在两个文件夹里的。您说的我再想想看可不可以做。做毕设做的满头包,很久没进度了,再弄不好老师怕是要动刀子了22333
    2018-5-2 10:41 回复
  • M丶Sulayman回复 bitxrj :分好了,手动加标签,然后想想,扔进网络里面的特征出了图像还应该有一些对清晰度判别的特征属性,关键在这里。
    2018-5-2 16:06 回复
  • M丶Sulayman回复 bitxrj :emmmmm......我刚看了你在另一篇帖子的回复,我还是不要班门弄斧了我上面说的都是自己的想法......没搞过图像,最多理解MNIST识别,抱歉抱歉,我就不胡诌了
    2018-5-2 16:28 回复
  • bitxrj回复 M丶Sulayman :不会,我就是小白,还在学习中。。
    2018-5-2 16:31 回复
jka  TF荚荚  发表于 2018-7-4 10:45:48 | 显示全部楼层
求数据集专题教程啊
本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

快速回复 返回顶部 返回列表