这算是我第一次正式、系统学习【机器学习】和【集成学习】,言外之意我就是个小白(交通专业,不过对用python进行数据分析还是有基础的)~~关于打卡,我只想把自己最关心的、对我最有价值的部分提取出来,一方面算作给自己的回忆,另一方面也算做给和我同样水平的小伙伴的分享吧!
1 什么是机器学习
一句话概括机器学习:利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。
- 这个数据长啥样呢? 从我的专业接触的数据分析概念出发,可以简单粗暴认为数据就是一个
DataFrame
表,一行表示一个样本 x i x_i xi,一列表示所有样本的一个特征 x ( k ) x^{(k)} x(k)。 - 有了数据,机器学习的任务是啥呢? 根据数据是否有因变量,机器学习的任务可分为有监督学习和无监督学习。
- 有监督学习和无监督学习的区别是什么?
有监督学习:给定某些特征去估计因变量;
无监督学习:给定某些特征但不给定因变量,建模的目的是学习数据本身的结构和关系。 - 本期机器学习的重点是【有监督学习】,那么有监督学习怎么分类?
回归:因变量是连续型变量;
分类:因变量是离散型变量。 - 机器学习的工具是什么?
sklearn
下面进入实操!
2 有监督学习导论
2.1 回归
第一步:导入要用的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")
import seaborn as sns
第二步:导入数据
因为是导论嘛,就用例子来说明问题吧。这里使用sklearn内置数据集Boston房价数据集。
sklearn
中所有内置数据集都封装在datasets对象内,返回的对象有:
data
:特征X
的矩阵(ndarray)target
:因变量的向量(ndarray)feature_names
:特征名称(ndarray)
from sklearn import datasets
boston = datasets.load_boston() # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
boston_data = pd.DataFrame(X,columns=features) # 注意这种生成表格的方式
boston_data["Price"] = y
这个数据长下面这样:
第三步:分析数据
各个特征的含义如下:
- CRIM:各城镇的人均犯罪率
- ZN:规划地段超过25,000平方英尺的住宅用地比例
- INDUS:城镇非零售商业用地比例
- CHAS:是否在查尔斯河边(=1是)
- NOX:一氧化氮浓度(/千万分之一)
- RM:每个住宅的平均房间数
- AGE:1940年以前建造的自住房屋的比例
- DIS:到波士顿五个就业中心的加权距离
- RAD:放射状公路的可达性指数
- TAX:全部价值的房产税率(每1万美元)
- PTRATIO:按城镇分配的学生与教师比例
- B: 1000 ( B k − 0.63 ) 2 1000(B_{k} - 0.63)^2 1000(Bk−0.63)2其中 B k B_{k} Bk是每个城镇的黑人比例
- LSTAT:较低地位人口
因变量:Price——房价
可以看出,因变量为波士顿房价Price是一个连续型变量,所以这是一个回归的例子。
2.2 分类
第一步:导入要用的包(和回归部分相同)
第二部:导入数据
这里使用sklearn
内置iris
数据集。
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
features = iris.feature_names
iris_data = pd.DataFrame(X,columns=features)
iris_data['target'] = y
这个数据长下面这样:
第三步:分析数据
各特征的含义如下:
- sepal length (cm):花萼长度(厘米)
- sepal width (cm):花萼宽度(厘米)
- petal length (cm):花瓣长度(厘米)
- petal width (cm):花瓣宽度(厘米)
因变量:target——类型
为了更直观地看这个数据,画个图:
marker = ['s','x','o']
plt.rcParams['font.sans-serif']=['Times New Roman']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (5,3), dpi = 512)
for index,c in enumerate(np.unique(y)):
plt.scatter(x=iris_data.loc[y==c,"sepal length (cm)"],
y=iris_data.loc[y==c,"sepal width (cm)"],
alpha=0.8,label=c,marker=marker[c])
plt.xlabel("sepal length (cm)")
plt.ylabel("sepal width (cm)")
plt.legend()
plt.show()
注意!这里用循环来对每一各target对应的值进行散点图绘制。一点小的技巧:
- 用
enumerate
函数来代替繁琐的for
循环; - 选中
y
(target)值为某值的一列的数据,用df.loc[y==c, '列名']
,也可以用df[df['target'] == 0]['列名'].tolist()
先看看花萼长度-花萼宽度的相关关系:
再看花瓣长度-花瓣宽度的相关关系:
可以看出,每种不同的颜色和点的样式为一种类型的鸢尾花,数据集有三种不同类型的鸢尾花(因变量是一个类别变量),因此通过特征预测鸢尾花类别的问题是一个分类问题。