人工智慧深度學習TensorFlow通過感知器實現鳶尾花資料集分類
一.iris資料集簡介
iris資料集的中文名是安德森鳶尾花卉資料集,英文全稱是Anderson’s Iris data set。iris包含150個樣本,對應資料集的每行資料。每行資料包含每個樣本的四個特徵和樣本的類別資訊,所以iris資料集是一個150行5列的二維表。
通俗地說,iris資料集是用來給花做分類的資料集,每個樣本包含了花萼長度、花萼寬度、花瓣長度、花瓣寬度四個特徵(前4列),我們需要建立一個分類器,分類器可以通過樣本的四個特徵來判斷樣本屬於山鳶尾、變色鳶尾還是維吉尼亞鳶尾(這三個名詞都是花的品種)。
二、資料來源
https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
三、感知器表示R,評價E,優化O
參閱 深度學習與TensorFlow實戰P45-47頁
四、TensorFlow通過感知器實現鳶尾花資料集分類的python程式碼
import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
def init_weights(shape):
return tf.Variable(tf.random_normal(shape,stddev=0.01))
#建立分割線
def plotLine(slope,bias):
x = np.arange(-3,3,0.5)
y = x*slope+bias
plt.plot(x,y)
if __name__ == "__main__":
#匯入資料,這裡用了pandas庫
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
features = df.iloc[1:len(df.index),[0,2]].values
labels = df.iloc[1:len(df.index),4].values
#調節資料,這一步很關鍵
scaler = preprocessing.StandardScaler().fit(features)
features_standard = scaler.transform(features)
#選取兩種花的兩類特徵
for index,label in enumerate(labels):
if label == "Iris-setosa":
plt.scatter(features[index,0], features[index,1], color='red', marker='o', label='setosa')
else:
plt.scatter(features[index,0], features[index,1], color='blue', marker='x', label='versicolor')
plt.xlabel('petal len')
plt.ylabel('sepal len')
plt.show()
#轉換一下標籤
labels=np.where(labels=="Iris-setosa",1,-1)
#使用sklearn類庫快速分割資料集
features_train, features_test, lables_train, labels_test=train_test_split(features_standard,labels,test_size=0.33)
#定義placeholder容器,第9章將會描述
X= tf.placeholder(tf.float32)
Y= tf.placeholder(tf.float32)
#初始化模型引數
w= init_weights([2,1])
b= tf.Variable(tf.zeros([1,1]))
#建立感知模型
predict_Y= tf.sign(tf.matmul(X,w)+b)
#定義損失函式
loss = tf.reduce_mean(tf.square(predict_Y-lables_train))
#定義優化方法
optimizer = tf.train.GradientDescentOptimizer(0.01)
train_step = optimizer.minimize(loss)
#初始化變數,執行模型
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
#開始訓練
for i in range(300):
sess.run(train_step,feed_dict = {X:features_train, Y:lables_train})
#提取訓練好的模型
w1= sess.run(w).flatten()[0]
w2= sess.run(w).flatten()[1]
b= sess.run(b).flatten()
#將測試資料和感知器分割線顯示出來
for index, label in enumerate(labels_test):
if label ==1:
plt.scatter(features_test[index, 0], features_test[index,1],color='red', marker='o', label='setosa')
else:
plt.scatter(features_test[index, 0], features_test[index,1],color='blue', marker='x', label='versicolor')
plt.xlabel('petal len')
plt.ylabel('sepal len')
plotLine(-w1/w2, -b/w2)
plt.show()
看看執行效果介面: