python 分类_简单机器学习入门教程:用Python解决简单的水果分类问题
在这篇机器学习入门教程中,我们将使用Python中最流行的机器学习工具scikit- learn,在Python中实现几种机器学习算法。使用简单的数据集来训练分类器区分不同类型的水果。
这篇文章的目的是识别出最适合当前问题的机器学习算法。因此,我们要比较不同的算法,选择性能最好的算法。让我们开始吧!
数据
水果数据集由爱丁堡大学的Iain Murray博士创建。他买了几十个不同种类的橘子、柠檬和苹果,并把它们的尺寸记录在一张桌子上。密歇根大学的教授们对水果数据进行了些微的格式化,可以从这里下载。
让我们先看一看数据的前几行。
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
fruits = pd.read_table('fruit_data_with_colors.txt')
fruits.head()
图1
数据集的每一行表示一个水果块,它由表中的几个特征表示。
在数据集中有59个水果和7个特征:
print(fruits.shape)
(59, 7)
在数据集中有四种水果:
print(fruits['fruit_name'].unique())
[“苹果”柑橘”“橙子”“柠檬”]
除了柑橘,数据是相当平衡的。我们只好接着进行下一步。
print(fruits.groupby('fruit_name').size())
图2
import seaborn as sns
sns.countplot(fruits['fruit_name'],label="Count")
plt.show()
图3
可视化
每个数字变量的箱线图将使我们更清楚地了解输入变量的分布:
fruits.drop('fruit_label', axis=1).plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False, figsize=(9,9),
title='Box Plot for each input variable')
plt.savefig('fruits_box')
plt.show()
图4
看起来颜色分值近似于高斯分布。
import pylab as pl
fruits.drop('fruit_label' ,axis=1).hist(bins=30, figsize=(9,9))
pl.suptitle("Histogram for each numeric input variable")
plt.savefig('fruits_hist')
plt.show()
图5
一些成对的属性是相关的(质量和宽度)。这表明了高度的相关性和可预测的关系。
from pandas.tools.plotting import scatter_matrix
from matplotlib import cm
feature_names = ['mass', 'width', 'height', 'color_score']
X = fruits[feature_names]
y = fruits['fruit_label']
cmap = cm.get_cmap('gnuplot')
scatter = pd.scatter_matrix(X, c = y, marker = 'o', s=40, hist_kwds={'bins':15}, figsize=(9,9), cmap = cmap)
plt.suptitle('Scatter-matrix for each input variable')
plt.savefig('fruits_scatter_matrix')
图6
统计摘要
图7
我们可以看到数值没有相同的缩放比例。我们需要将缩放比例扩展应用到我们为训练集计算的测试集上。
创建训练和测试集,并应用缩放比例
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
构建模型
逻辑回归
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
print('Accuracy of Logistic regression classifier on training set: {:.2f}'
.format(logreg.score(X_train, y_train)))
print('Accuracy of Logistic regression classifier on test set: {:.2f}'
.format(logreg.score(X_test, y_test)))
训练集中逻辑回归分类器的精确度:0.70
测试集中逻辑回归分类器的精确度:0.40
决策树
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier().fit(X_train, y_train)
print('Accuracy of Decision Tree classifier on training set: {:.2f}'
.format(clf.score(X_train, y_train)))
print('Accuracy of Decision Tree classifier on test set: {:.2f}'
.format(clf.score(X_test, y_test)))
训练集中决策树分类器的精确度:1.00
测试集中决策树分类器的精确度:0.73
K-Nearest Neighbors(K-NN )
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
print('Accuracy of K-NN classifier on training set: {:.2f}'
.format(knn.score(X_train, y_train)))
print('Accuracy of K-NN classifier on test set: {:.2f}'
.format(knn.score(X_test, y_test)))
训练集中K-NN 分类器的精确度:0.95
测试集中K-NN 分类器的精确度:1.00
线性判别分析
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis()
lda.fit(X_train, y_train)
print('Accuracy of LDA classifier on training set: {:.2f}'
.format(lda.score(X_train, y_train)))
print('Accuracy of LDA classifier on test set: {:.2f}'
.format(lda.score(X_test, y_test)))
训练集中LDA分类器的精确度:0.86
测试集中LDA分类器的精确度:0.67
高斯朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(X_train, y_train)
print('Accuracy of GNB classifier on training set: {:.2f}'
.format(gnb.score(X_train, y_train)))
print('Accuracy of GNB classifier on test set: {:.2f}'
.format(gnb.score(X_test, y_test)))
训练集中GNB分类器的精确度:0.86
测试集中GNB分类器的精确度:0.67
支持向量机
from sklearn.svm import SVC
svm = SVC()
svm.fit(X_train, y_train)
print('Accuracy of SVM classifier on training set: {:.2f}'
.format(svm.score(X_train, y_train)))
print('Accuracy of SVM classifier on test set: {:.2f}'
.format(svm.score(X_test, y_test)))
训练集中SVM分类器的精确度:0.61
测试集中SVM分类器的精确度:0.33
KNN算法是我们尝试过的最精确的模型。混淆矩阵提供了在测试集上没有错误的指示。但是,测试集非常小。
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
pred = knn.predict(X_test)
print(confusion_matrix(y_test, pred))
print(classification_report(y_test, pred))
图8
绘制k-NN分类器的决策边界
import matplotlib.cm as cm
from matplotlib.colors import ListedColormap, BoundaryNorm
import matplotlib.patches as mpatches
import matplotlib.patches as mpatches
X = fruits[['mass', 'width', 'height', 'color_score']]
y = fruits['fruit_label']
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
def plot_fruit_knn(X, y, n_neighbors, weights):
X_mat = X[['height', 'width']].as_matrix()
y_mat = y.as_matrix()
# Create color maps
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF','#AFAFAF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF','#AFAFAF'])
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
clf.fit(X_mat, y_mat)
# Plot the decision boundary by assigning a color in the color map
# to each mesh point.
mesh_step_size = .01 # step size in the mesh
plot_symbol_size = 50
x_min, x_max = X_mat[:, 0].min() - 1, X_mat[:, 0].max() + 1
y_min, y_max = X_mat[:, 1].min() - 1, X_mat[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, mesh_step_size),
np.arange(y_min, y_max, mesh_step_size))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
# Plot training points
plt.scatter(X_mat[:, 0], X_mat[:, 1], s=plot_symbol_size, c=y, cmap=cmap_bold, edgecolor = 'black')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
patch0 = mpatches.Patch(color='#FF0000', label='apple')
patch1 = mpatches.Patch(color='#00FF00', label='mandarin')
patch2 = mpatches.Patch(color='#0000FF', label='orange')
patch3 = mpatches.Patch(color='#AFAFAF', label='lemon')
plt.legend(handles=[patch0, patch1, patch2, patch3])
plt.xlabel('height (cm)')
plt.ylabel('width (cm)')
plt.title("4-Class classification (k = %i, weights = '%s')"
% (n_neighbors, weights))
plt.show()
plot_fruit_knn(X_train, y_train, 5, 'uniform')
图9
k_range = range(1, 20)
scores = []
for k in k_range:
knn = KNeighborsClassifier(n_neighbors = k)
knn.fit(X_train, y_train)
scores.append(knn.score(X_test, y_test))
plt.figure()
plt.xlabel('k')
plt.ylabel('accuracy')
plt.scatter(k_range, scores)
plt.xticks([0,5,10,15,20])
图10
对于这个特定的数据集,当k = 5时,我们获得了最高精确度。
结语
在这篇文章中,我们关注的是预测的准确度。我们的目标是学习一个具有良好泛化性能的模型。这样的模型使预测准确度最大化。通过比较不同的算法,我们确定了最适合当前问题的机器学习算法(即水果类型分类)。
创建这个帖子的源代码可以在这里找到。
python 分类_简单机器学习入门教程:用Python解决简单的水果分类问题相关推荐
- python在线爬虫_Python爬虫入门教程 99-100 Python爬虫在线服务大全
本篇文章梦想橡皮擦会为大家介绍一些 python 爬虫相关的在线服务,这些在线服务或者工具很多时候都会大幅度的提高爬取数据的速度. 为何写本篇文章 爬虫百例博客已经临近结尾,最即将收尾之际,希望这篇文 ...
- python教学视频下载-Python机器学习入门教程全套视频下载【传智播客】
Python机器学习入门教程 初级共3天课 本套教程是机器学习的入门课程,主要介绍一些经典的传统机器学习算法,如分类算法:KNN算法,朴素贝叶斯算法,逻辑回归,决策树算法以及随机森林;回归算法:线性回 ...
- 曲线聚类_机器学习入门必读:6种简单实用算法及学习曲线、思维导图
来源:大数据DT 本文约3500字,建议阅读7分钟 本文为你介绍掌握机器领域知识的学习曲线.技术栈以及常用框架. [ 导读 ] 大部分的机器学习算法主要用来解决两类问题--分类问题和回归问题.在本文当 ...
- python机器学习及实践_机器学习入门之《Python机器学习及实践:从零开始通往Kaggle竞赛之路》...
本文主要向大家介绍了机器学习入门之<Python机器学习及实践:从零开始通往Kaggle竞赛之路>,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. <Python 机 ...
- keil obj 文件 结构_【Python】数据分析前的入门教程 Python For Everybody P2:数据结构...
这是密歇根大学课程Python For Everybody总结的P2部分.课程总结P1部分的地址如下: P1: 零基础程序设计(Python 入门) carolinezhq:[Python]数据分析前 ...
- python很全的爬虫入门教程
python很全的爬虫入门教程 一.爬虫前的准备工作 首先,我们要知道什么是爬虫 1.什么是网络爬虫? 网络爬虫是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁 ...
- 机器学习入门必读:6种简单实用算法及学习曲线、思维导图
来源:大数据DT 本文约3500字,建议阅读7分钟 本文为你介绍掌握机器领域知识的学习曲线.技术栈以及常用框架. [ 导读 ] 大部分的机器学习算法主要用来解决两类问题--分类问题和回归问题.在本文当 ...
- MIT博士小姐姐的机器学习入门教程开课!碎片时间服用,每周一更 | 资源
铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI 厌倦了千篇一律的机器学习教学课程怎么办?没有太多时间预算怎么学? 来点不一样的. 现在,两位MIT博士小姐姐搞了一套机器学习入门教程ML T ...
- 第三章 Python Kivy 学习 -- Kivy官方入门教程Pong Game
系列文章目录 第一章 Python Kivy 学习 – Kivy介绍及环境安装 第二章 Python Kivy 学习 – Kivy项目开发原理(待编辑) 第三章 Python Kivy 学习 – Ki ...
最新文章
- python【蓝桥杯vip练习题库】BASIC-17矩阵乘法(枚举)
- C语言写的流氓关机程序及破解
- 【小白学习PyTorch教程】九、基于Pytorch训练第一个RNN模型
- C/C++隐式类型转换导致的若干问题
- css结构和重叠之选择器的特殊性
- 腾讯安全平台部专家研究员胡育辉:千亿黑产背后的破局之道
- python 定时器_python 线程之四:定时器(Timer),非阻塞
- 【苹果cms10 Maccmsv10 站群深度定制版 开发日志】 数据渲染模块
- 1e-5 java_内功心法 -- java.util.LinkedListE (5)
- 车型代号对照表_宝马内部代号对应车型解读,绝密!
- 黑群晖XPEnoboot for DSM 5.2-5967.1
- 在AndroidStudio中使用ARCore
- 黑客主要学习python的什么_黑客最常用的黑客语言——Python!
- 电脑突然找不到wifi 的解决方法
- 7-22 龟兔赛跑 (20分) Python
- 打不开Eclipse,Eclipse闪退(已解决)
- 华硕p9d服务器主板什么系统,华硕服务器主板P9D-V
- 一名测试开发工程师的内心自白,被裁员之前,没得到任何风声,措手不及......
- 小程序wxs使用教程
- BZOJ [Ahoi2008]Meet 紧急集合
热门文章
- Oracle 恢复dmp文件到数据库表中 【数据系列 1】
- 使用API修改控制台输出的颜色(前景色和背景色)
- Android将screenOrientation设置为portrait不起作用
- 9、Linux 用户管理
- 战力爆表|21支明星战队等你围观!
- 调试经验——任意字符对应的Unicode查询方法及Unicode对应字符的查询
- 在各大厂的秋招春招中,笔试面试都是必考的
- 【区块链技术工坊31期】许向:艺术品领域区块链探索实践
- Ubuntu18.04安装RTL8821CU USB无线网卡
- “旧城改造”的背后——银泰新零售阿里云解决方案(下)