Py学习  »  机器学习算法

机器学习之分类

衡阳信安 • 1 年前 • 128 次点击  

Abstract

之前两天,我们只是简单了解了一下经典的机器学习模型,如线性模型之类的,但是这都还是在传统的数学框架之下,和经典算法并没有太大的区别,从今天开始,我们需要深入学习机器学习,学习一个很经典的问题:分类

分类是一种监督学习算法,它可以解决之前使用线性回归模型解决不了的问题,而分类有两种类型:二分和多分

分类呢,它使用各种各样的算法来判断数据的类型,这次我们要解决的是烹饪数据,我们可以通过一道菜的组成(比如说用了什么调料)来判断这道菜是哪里的菜(印度地区的或者亚洲的)

Introduction

分类是一种ML和数据科学里最基础的行为,从最简单的二分到复杂的图像识别分类,它在分类数据上有着非常重要的价值,更学术一点来说就是,我们的分类方法建立了一个预测模型,它帮助我们建立从输入到输出的关系,而输出内容为是或否

微软的课程里给了张图用来描述二分和多分,其实我们很好理解了,不过还是把这个图贴出来吧

Preview

不过再最终开始之前,我们先看一看ML里常见的分类方法

从统计学的角度说,我们可以通过多维度的信息来进行分类,对于吸烟者来说,就有体重、年龄等可以用来决定你是否患病的因素,在监督学习里,我们需要在之前我们做数据越测的基础上加上一点东西:标签,我们可以给一个病人的数据贴上标签,这样ML就知道了这个病人到底患没患病,微软的课给了个视频,通过这个视频,也许我们可以一定程度上了解分类问题的基础

https://youtu.be/GuTeDbaNoEU

Start

现在我们可以开始了,不过要做的第一步工作还是预处理数据,如果没有预处理的话,最终训练可能会出现偏差,或者干脆报错

装一下imblearn库,至于干啥用的等下我们会知道的

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple imblearn

现在做准备工作

import pandas as pd
from matplotlib import pyplot as plt
import matplotlib as mpl
import numpy as np
from imblearn.over_sampling import SMOTE
import pathlib

fp = str(pathlib.Path(__file__).parent.resolve())

cuisines = pd.read_csv(fp + '/cuisines.csv')

然后我们来看一看这个数据大概长什么样

从这个情况来看,应该是这么多列包含的这道菜用了什么食材,产地在哪

接着,查看这个数据集里各国食物的数量

宇宙起源大韩民族(bushi最多

不过种类大多也就是这些了,毕竟是跟着人家学的,就不要要求那么高了

接着,把各国的都单独弄出来,方法之前说过的,类似z3的语法,很奇妙

thai_cuisines = cuisines[cuisines['cuisine'] == 'that']
japanese_cuisines = cuisines[cuisines['cuisine'] == 'japanese']
chinese_cuisines = cuisines[cuisines['cuisine'] == 'chinese']
indian_cuisines = cuisines[cuisines['cuisine'] == 'indian']
korean_cuisines = cuisines[cuisines['cuisine'] == 'korean']

为了更好分析不同国家的食物用什么用得比较多,我们需要对不同国家的数据都简单可视化一下,这样方便我们分析,建立一个分析函数

def create_ingredient_df(df):
    ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
    ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
    ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False)
    return ingredient_df

这个函数先把无用的数据列去掉,再以x轴求和(也就是按行求和,将各个行的加起来)并重命名数据叫value,并去0,最后按value排个序

不得不说魔法函数还真多

来看一下中国前20的

我都没想到酱油姜大蒜葱之类的是最多的。。可能还是做饭做少了

其他几个国家也差不多其实,大差不差的,日本酱油也排第一,但是饭排第二

好了,看完这个我们会对每个国家都有一个大概的印象,下一步也就是训练模型,那么我们需要分离标签和训练用数据

在微软的课程里,一个概念很重要,什么数据是需要被加入到训练集的,由于饭 姜 大蒜这些东西哪个国家都用的多,体现不了差异性,所以。。都给去掉了

feature_df = cuisines.drop(['cuisine''Unnamed: 0''rice''ginger''garlic'], axis=1)
label_df = cuisines['cuisine']

接下来一步是使得数据公平(这个机翻感好重啊。。)其实就是,我们发现韩国的数据量最大,这当然不行啊,那我们又没有那么多的数据,怎么办。。之前引入的imblearn就可以做这个事。。模拟出数据,就。。挺难蚌的,现在我也不知道它怎么模拟的数据,而且,模拟出的数据能保证数平衡性吗?都先画个问号好叭

oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, label_df)

print(f'new label count: {transformed_label_df.value_counts()}')
print(f'old label count: {label_df.value_counts()}')

到此为止,我们就预处理好数据了,接着把数据保存下来就可以了,保存为csv

transformed_df = pd.concat([transformed_feature_df, transformed_label_df], axis=1, join='outer')
transformed_df.to_csv(fp + '/clearned.csv')

在做完了这项工作以后,终于可以开始训练数据了,在sklearn这个库里,提供了几个常见的模型

  • Linear Models

  • Support Vector Machines

  • Nearest Neighbors

  • Gaussian Processes

  • Decision Tress

  • Ensemble methods

  • Multiclass and multiouput algorithms

  • Neural Networks(这个没包含,但是也重要,就写进来了)

来了来了,那些常见的名词终于出现了,SVM向量机,Decision Trees决策树 Neural Networks神经网络

在现在这个阶段,我们不需要去考虑这些算法或者模型的具体实现,我们需要先让模型跑起来,并且,sklearn也提供了几种算法的对比

这张图表达的是,输入数据是红蓝两种颜色的点集,要求这几种算法将这些点分类,然后能够对位置数据进行分类,很明显, 而后面那些红蓝相间的图就是各个算法的分类结果,可以发现其实他们分类出来的差别非常多,因此,只有深入理解了每种算法的原理,才可以在实战中选择正确的模型,下面是几个常见模型的性能对比

线性模型的速度是最快的,但是适用范围是最捉急的,很多很多模型都不能用线性模型简单地分类,毕竟它的表达很简单,第二个神经网络,但是神经网络过于复杂,它虽然非常准确,但是它却需要很长的训练时间和大量的算力,所以也不一定是一个很好的选择,而决策树,或者叫决策森林是兼具上面两者的优点的,下面的One-vs-All Multiclass我大概看了一下,就是将多分类问题转化为二分问题,描述如下

所以事实上,这个多分类算法的效率取决于它所使用的二分算法,其实也就是把N分类问题转为了N个二分问题,最后一个是决策树,现在还没有深入了解它,但是目前看来,它应该是一个类似于二叉树的结构,通过不断二分来进行分类,而每一次进行分类的依据就是需要训练的东西


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/151822
 
128 次点击