前言
这个系列主要是面向做工程的同事做一些分享,旨在让大家都可以应用机器学习来解决问题,而不仅仅是看看理论浅尝辄止。
机器学习是一门包含多方面知识的学科,想要几天掌握是不太可能的。但是如果把它当做一个工具来使用,不追本溯源,其实不需要花费太多的时间。
这一系列分享的目的在于,希望全部完成以后,任何一个会写代码但对机器学习还不了解的同学,都可以上手运用机器学习的工具来完成一些预测任务,如分类或回归。
机器学习包含了有监督学习与无监督学习,但是由于时间有限,这一系列分享的内容仅包含有监督学习,因此下文的机器学习特指有监督学习
概括
机器学习也就是让机器从已知数据中自动的学习出规律,从而再对未知的数据进行预测。如何让机器从数据中学习知识?从什么样的数据才能学习到知识?解决这两个问题是有套路可用的,下面就来讲如何去套路。
如何让机器从数据中学习?
现在已经有非常多种成熟的机器学习算法,如KNN,逻辑回归,决策树,SVM,各种ensemble方法,以及深度学习的神经网络。不同的算法适用于不同的情况。学习这些算法需要花费大量的时间与精力,但是可以把这些算法全部看成一个API来进行调用。比如对于二分类的任务,不管用什么算法,输入输出都是一样的,即训练时输入样本集,输出训练好的模型。预测时,输入未知样本,输出类别标签,通常为0/1。
把不同的算法抽象成API以后,就可以暂且不需要知道背后的原理也能开心的应用了。
从什么样的数据才能学习到知识?
有了算法API接下来就是准备好数据,输入的数据应该长什么样呢?输入的数据应该是结构化的表格数据。训练模型的输入数据也叫做训练集,可以看成数据库的一张表,每行记录为一个样本,每个字段为一个特征。其中有一个字段标示每个样本的类别或者是某个连续值。由于机器学习模型都是数学模型,每一个特征都需要转换为数值型数据。
归纳一下:只需要准备好一个二维数组,每个维度都是数值型数据,可以是连续也可以是离散的,就可以调用算法API进行学习了。
第一讲就围绕如何准备机器学习的数据来进行讲解,包括了数据探索以及一些数据预处理的技巧。
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'png' #set 'png' here when working on notebook
%matplotlib inline
这里的案例数据采用Kaggle Titanic数据集,每行代表一个乘客,每列为乘客的特征。标签是存活与否,即这是一个二分类任务。
下面是几个字段的说明:
- survival 生还与否 (0 = No; 1 = Yes)
- pclass 乘客乘坐的舱位级别 (1 = 1st; 2 = 2nd; 3 = 3rd)
- name 姓名
- sex 性别
- age 年龄
- sibsp 船上兄弟姐妹的数量
- parch 船上父母或子女的数量
- ticket 票号
- fare 票价
- cabin 客舱
- embarked 登船港口 (C = Cherbourg; Q = Queenstown; S = Southampton)
#载入数据,案例数据使用Kaggle Titanic数据集
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
train.head(10)
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th… | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
5 | 6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
6 | 7 | 0 | 1 | McCarthy, Mr. Timothy J | male | 54.0 | 0 | 0 | 17463 | 51.8625 | E46 | S |
7 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard | male | 2.0 | 3 | 1 | 349909 | 21.0750 | NaN | S |
8 | 9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) | female | 27.0 | 0 | 2 | 347742 | 11.1333 | NaN | S |
9 | 10 | 1 | 2 | Nasser, Mrs. Nicholas (Adele Achem) | female | 14.0 | 1 | 0 | 237736 | 30.0708 | NaN | C |
观察数据,处理数据
实际的工作中,我们可能要从多个数据源收集数据,最终再汇总成一个结构化的表格。这里原始的输入数据已经是结构化的表格数据,减少了很多ETL的工作。但是这些数据还不能直接作为输入数据给机器学习算法,因为有很多字段还存在非数值型数据,以及缺失数据NaN
。接下来先简单的把这些数据都转换为数值型数据。
#1. 丢弃认为对分类没有必要的特征,如有大量缺失值的Cabin。Ticket为票号,比较散乱无序,暂且认为与乘客的生还与否没有关系。
train = train.drop(['Ticket','Cabin'], axis=1)
test = test.drop([