前几天把python基础知识过了一遍,拿了这个小例子作为练手项目,这个案例也有师兄的帮助,记录完,发现代码贴的很多,文章有点长,为了节省篇幅,有一些说明就去掉了,毕竟鸢尾花数据集比较经典,网上能找到很多和我差不多的案例。还有就是发现一个新的markdown排版工具,今天想试试效果。
数据来源
首先说一下,该数据集来源于网络。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。数据来源:http://archive.ics.uci.edu/ml/datasets/Iris
先搜了一下,什么是花瓣和花萼,小小科普。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MiqxQnQ6-1601307500587)(https://github.com/mengxiaoxu/mengxiaoxu.github.io/raw/master/_posts/images/机器学习/花瓣花萼.png)]
数据简单处理
import pandas as pd
# 读入数据
df = pd.read_csv('iris/iris.csv')
'''
数据时以逗号为分隔符的,
但是这个数据没有列的名字,
所以先给每个列取个名字,
直接使用数据说明中的描述
'''
df.columns = ['sepal_len', 'sepal_width', 'petal_len', 'petal_width', 'class']
# 查看前5条数据
df.head()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H5K45l0Q-1601307500592)(https://github.com/mengxiaoxu/mengxiaoxu.github.io/raw/master/_posts/images/机器学习/数据前5行.png)]
'''
最后类别一列,感觉前面的'Iris-'有点多余
即把class这一列的数据按'-'进行切分
取切分后的第二个数据,为了好看一点点
'''
df['class'] = df['class'].apply(lambda x: x.split('-')[1])
# 查看数据信息
df.describe()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YpZ6MoBL-1601307500594)(https://github.com/mengxiaoxu/mengxiaoxu.github.io/raw/master/_posts/images/机器学习/数据描述.png)]
使用describe()可以很方便的查看数据的大致信息,可以看到数据是没有缺失值的,总共有145条,每一列的最大值、最小值、平均值都可以查看。
数据可视化
为了比较直观的查看数据的分布,用matplotlib进行了简单的可视化展示,查看数据的分布,画个图。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
%matplotlib inline
def scatter_plot_by_category(feat, x, y):
alpha = 0.5
gs = df.groupby(feat)
cs = cm.rainbow(np.linspace(0, 1, len(gs)))
for g, c in zip(gs, cs):
plt.scatter(g[1][x], g[1][y], color=c, alpha=alpha)
plt.figure(figsize=(20,5))
plt.subplot(131)
scatter_plot_by_category('class', 'sepal_len', 'petal_len')
plt.xlabel('sepal_len')
plt.ylabel('petal_len')
plt.title('class')
# 为了节省篇幅,省了第二、三个图的代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfob0y8d-1601307500596)(https://github.com/mengxiaoxu/mengxiaoxu.github.io/raw/master/_posts/images/机器学习/散点图.png)]
import seaborn as sb
plt.figure(figsize=(20, 10))
for column_index, column in enumerate(df.columns):
if column == 'class':
continue
plt.subplot(2, 2, column_index + 1)
sb.violinplot(x='class', y=column, data=df)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DDu1vkwM-1601307500597)(https://github.com/mengxiaoxu/mengxiaoxu.github.io/raw/master/_posts/images/机器学习/花花.png)]
模型训练
因为鸢尾花数据集很简单,特征已经全部提取好了,而且也很纯,所以就直接放到机器学习算法里面训练了。这里使用的是决策树分类算法。
# 首先对数据进行切分,即分出数据集和测试集
from sklearn.cross_validation import train_test_split
all_inputs = df[['sepal_len', 'sepal_width',
'petal_len', 'petal_width']].values
all_classes = df['class'].values
(X_train,
X_test,
X_train,
Y_test) = train_test_split(all_inputs, all_classes, train_size=0.8, random_state=1)
# 使用决策树算法进行训练
from sklearn.tree import DecisionTreeClassifier
# 定义一个决策树对象
decision_tree_classifier = DecisionTreeClassifier()
# 训练模型
model = decision_tree_classifier.fit(training_inputs, training_classes)
# 所得模型的准确性
print(decision_tree_classifier.score(testing_inputs, testing_classes))
# 使用训练的模型进行预测,为了偷懒,
# 直接把测试集里面的数据拿出来了三条
print(X_test[0:3])
print(Y_test[0:3])
model.predict(X_test[0:3])
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YELyroAm-1601307500598)(https://github.com/mengxiaoxu/mengxiaoxu.github.io/raw/master/_posts/images/机器学习/预测.png)]
可以看到效果还是不错,在测试集上的准确率达到了97%。网上还有人提供了一个可视化工具Graph Visualization(http://www.graphviz.org/),可以利用它把构建的决策树模型直观的展示出来,这里不展示了,代码贴太多了,文章太长了。
写在最后
推荐一个课程,是吴恩达在网易云课堂开设的微专业——深度学习工程师课程,我学了几天了,讲的比较清晰,而且是免费的,现在我已经学完第二周的课时了,后面打算把自己的学习笔记也发出来一起交流。
课程地址:http://mooc.study.163.com/smartSpec/detail/1001319001.htm
推荐阅读:
个人微信:Guanngxu
转载:https://blog.csdn.net/heuguangxu/article/details/80426437