鸢尾花分类

鸢尾花数据集

鸢尾花数据集包含四个特征和一个标签。这四个特征确定了单株鸢尾花的下列植物学特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。我们的模型会将这些特征表示为float32数值数据。 该标签确定了鸢尾花品种,品种必须是下列任意一种:山鸢尾 (0)、变色鸢尾 (1)、维吉尼亚鸢尾 (2)。我们的模型会将该标签表示为int32分类数据。

算法

该程序会训练一个具有以下拓扑结构的深度神经网络分类器模型:2 个隐藏层,每个隐藏层包含 10 个节点。

下图展示了特征、隐藏层和预测(并未显示隐藏层中的所有节点):

 

推理

在无标签样本上运行经过训练的模型会产生三个预测,即相应鸢尾花属于指定品种的可能性。这些输出预测的总和是 1.0。例如,对无标签样本的预测可能如下所示:0.03(山鸢尾)、0.95(变色鸢尾)、0.02(维吉尼亚鸢尾)。该预测表示指定无标签样本是变色鸢尾的概率为 95%。

数据分析

所有功能的出发点都是数据,下面对数据进行全面的分析。首先,这个数据集是网上公开的一个CSV格式的数据集,可以将数据下载,使用pandas对数据进行分析。在此处已经将数据下载好并放在data文件下。

下面使用pandas对数据进行读取,并部分展示,由于下载的数据自带格式所以做了一下处理。

import pandas as pd
import tensorflow as tf
CSV_COLUMN_NAMES = ['SepalLength','SepalWidth','PetalLength', 'PetalWidth', 'Species']
data_train=pd.read_csv('./data/iris_test.csv',names=CSV_COLUMN_NAMES,header=0)
data_test=pd.read_csv('./data/iris_training.csv',names=CSV_COLUMN_NAMES,header=0)
data_train.head()

Out[1]:

 SepalLengthSepalWidthPetalLengthPetalWidthSpecies
05.93.04.21.51
16.93.15.42.12
25.13.31.70.50
36.03.44.51.61
45.52.54.01.31

 

构建模型

在构建模型结构时暂时不需要数据的输入,但需要制定有几个特征需要输入,从上面的结构中可以看出。输入的特征有四个:花萼长度(seqpallength),花萼宽度(sepalwidth),花瓣长度 (petallength),花瓣宽度 (petalwidth)。而最后一个是预测值,species 代表他是哪种鸢尾花:山鸢尾(0),变色鸢尾(1),维吉尼亚鸢尾 (2)。所以我们先将属性值与标记值区分开

train_x, train_y = data_train, data_train.pop('Species')
test_x, test_y = data_test, data_test.pop('Species')
train_x.head()

 

Out[2]:

 SepalLengthSepalWidthPetalLengthPetalWidth
05.93.04.21.5
16.93.15.42.1
25.13.31.70.5
36.03.44.51.6
45.52.54.01.3
my_feature_columns = []  #从train_x提取特征值
for key in train_x.keys():
    my_feature_columns.append(tf.feature_column.numeric_column(key=key))
print(my_feature_columns)

 

[_NumericColumn(key='SepalLength', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), _NumericColumn(key='SepalWidth', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), _NumericColumn(key='PetalLength', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), _NumericColumn(key='PetalWidth', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None)]

下面开始构建训练模型

classifier = tf.estimator.DNNClassifier(
   # 这个模型接受哪些输入的特征
    feature_columns=my_feature_columns,
    # 包含两个隐藏层,每个隐藏层包含10个神经元.
    hidden_units=[10, 10],
    # 最终结果要分成的几类
    n_classes=3)
 

 

INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpg62ivkem
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpg62ivkem', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x7efc2dc54160>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

训练模型

下面就需要为模型提供数据并进行训练,由于tensorflow采用一个批量梯度下降算法更新参数,这里可以构造一个函数来生成数据,并且可以在这个函数当中对数据进行打乱。

def train_func(train_x,train_y):
    dataset=tf.data.Dataset.from_tensor_slices((dict(train_x), train_y))
    dataset = dataset.shuffle(1000).repeat().batch(100)
    return dataset

下面可以进行模型训练,进行1000个回合的训练,每次调100的数据。

classifier.train(
    input_fn=lambda:train_func(train_x,train_y),
    steps=1000)

 

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpg62ivkem/model.ckpt.
INFO:tensorflow:loss = 131.49458, step = 0
INFO:tensorflow:global_step/sec: 230.342
INFO:tensorflow:loss = 11.232605, step = 100 (0.435 sec)
INFO:tensorflow:global_step/sec: 508.696
INFO:tensorflow:loss = 8.845632, step = 200 (0.196 sec)
INFO:tensorflow:global_step/sec: 509.375
INFO:tensorflow:loss = 7.626791, step = 300 (0.196 sec)
INFO:tensorflow:global_step/sec: 515.75
INFO:tensorflow:loss = 6.2779765, step = 400 (0.194 sec)
INFO:tensorflow:global_step/sec: 459.292
INFO:tensorflow:loss = 6.688465, step = 500 (0.218 sec)
INFO:tensorflow:global_step/sec: 509.881
INFO:tensorflow:loss = 6.19946, step = 600 (0.196 sec)
INFO:tensorflow:global_step/sec: 523.267
INFO:tensorflow:loss = 6.8552265, step = 700 (0.191 sec)
INFO:tensorflow:global_step/sec: 526.077
INFO:tensorflow:loss = 6.5732956, step = 800 (0.190 sec)
INFO:tensorflow:global_step/sec: 519.665
INFO:tensorflow:loss = 6.094924, step = 900 (0.192 sec)
INFO:tensorflow:Saving checkpoints for 1000 into /tmp/tmpg62ivkem/model.ckpt.
INFO:tensorflow:Loss for final step: 5.365243.

Out[6]:

<tensorflow.python.estimator.canned.dnn.DNNClassifier at 0x7efc2dc54b00>

模型预测

可以使用下面方法对测试集的数据进行预测,并查看效果

def eval_input_fn(features, labels, batch_size):
    features=dict(features)
    if labels is None:
        # No labels, use only features.
        inputs = features
    else:
        inputs = (features, labels)
    dataset = tf.data.Dataset.from_tensor_slices(inputs)
    assert batch_size is not None, "batch_size must not be None"
    dataset = dataset.batch(batch_size)
    return dataset
predict_arr = []
predictions = classifier.predict(
        input_fn=lambda:eval_input_fn(test_x,labels=test_y,batch_size=100))
for predict in predictions:
    predict_arr.append(predict['probabilities'].argmax())
result = predict_arr == test_y
result1 = [w for w in result if w == True]
print("准确率为 %s"%str((len(result1)/len(result))))

INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpg62ivkem/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. 准确率为 0.9833333333333333

 

 

 

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值