一、机器学习简介
1.机器学习发展历程
简单用思维导图的形式梳理一下机器学习的发展历程:
在过去二十年中,人类收集 、存储、传输、处理数据的能力取得了飞速提升,人类社会的各个角落都积累了大量数据,亟需能有效地对数据进行分析利用的机器算法,而机器学习顺应了大时代的这个需求,因此该学科领域很自然地取得巨大发展、受到广泛关注。
2.机器学习任务分类
机器学习大体可分为如下几类:
重点讲解“监督”的含义。以监督学习(supervised learning)为例,监督学习的任务是尝试学习一个数学模型,使模型能够对任意给定的输入,对其相应的输出做一个好的预测。监督指的是输出存在且已知(在分类情况下种类已知,在回归情况下范围已知)。而半监督聚类学习和无监督学习的目的是探究数据中的内部关系和结构。
二、机器学习实例代码演示
1.准备工作
- 使用anaconda搭建运行环境
参考教程:
Win10利用Anaconda搭建Pandas+Numpy环境 - 安装相关包(这里也可以写到requirements.txt中统一进行安装)
pip install numpy
pip install pandas
pip install sklearn
pip install matplotlib
pip install seaborn
- 代码头部引入相关包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")
import seaborn as sns
from sklearn import datasets
2.回归
1)回归分析概述
在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量间互相依赖的定量关系的一种统计分析方法。
根据自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。
其中线性回归分析可分为一元线性回归和多元线性回归。
2)回归案例
波士顿房价数据集包含美国人口普查局收集的美国马萨诸塞州波士顿住房价格的有关信息, 数据集很小,只有506个案例。
变量名 | 说明 |
---|---|
CRIM | 城镇人口犯罪率 |
ZN | 超过25000平方英尺的住宅用地所占比例 |
INDUS | 城镇非零售业务地区的比例 |
CHAS | 查尔斯河虚拟变量(如果土地在河边=1;否则是0) |
NOX | 一氧化氮浓度(每1000万份) |
RM | 平均每居民房数 |
AGE | 在1940年之前建成的所有者占用单位的比例 |
DIS | 与五个波士顿就业中心的加权距离 |
RAD | 辐射状公路的可达性指数 |
TAX | 每10,000美元的全额物业税率 |
RTRATIO | 城镇师生比例 |
B | 1000(Bk-0.63)^2其中Bk是城镇黑人的比例 |
LSTAT | 人口中地位较低人群的百分数 |
MEDV | (目标变量/类别属性)以1000美元计算的自有住房的中位数 |
查看数据集:
v_housing = datasets.load_boston()
X = v_housing.data
y = v_housing.target
features = v_housing.feature_names
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
boston_data.head()
查看特征种类:
print(v_housing.feature_names)
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
'B' 'LSTAT']
对十三个变量和价格以散点图的方式进行可视化:
v_namedata = v_housing.feature_names
for i in range(len(v_housing.feature_names)):
sns.scatterplot(x=X[:,i],y=y,color="r",alpha=0.6)
plt.title(v_namedata[i])
plt.show()
可以看到住宅平均房间数(RM)与价格(Prine)更接近正线性相关,我们求一下相关的系数权重w和偏移量b:
from sklearn.linear_model import LinearRegression
plt.rcParams['font.sans-serif'] = ['SimHei']
x = v_housing.data[:,5,np.newaxis]
y = v_housing.target
lm = LinearRegression()
lm.fit(x,y)
print('方程的确定性系数R的平方:',lm.score(x,y))
print('线性回归算法的权重w:',lm.coef_)
print('线性回归算法的偏移量b:',lm.intercept_)
plt.scatter(x,y,color='blue')
plt.plot(x,lm.predict(x),color='green',linewidth=6)
plt.xlabel('住宅平均房间数(RM)')
plt.ylabel(u'房屋价格')
plt.title('线性回归住宅平均房间数RM与房屋价格Price的关系')
plt.show()
方程的确定性系数R的平方: 0.48352545599133423
线性回归算法的权重w: [9.10210898]
线性回归算法的偏移量b: -34.670620776438554
3.分类案例
鸢(yuān)尾花
Iris Data Set(鸢尾属植物数据集)是历史比较悠久的数据集,它首次出现在著名的英国统计学家和生物学家Ronald Fisher 1936年的论文《The use of multiple measurements in taxonomic problems》中,被用来介绍线性判别式分析。
在这个数据集中,包括了三类不同的鸢尾属植物:Iris Setosa,Iris Versicolour,Iris Virginica。每类收集了50个样本,因此这个数据集一共包含了150个样本,每个样本选取4个代表性的特征,它们分别是:
- sepallength:萼片长度,单位是厘米
- sepalwidth:萼片宽度,单位是厘米
- petallength:花瓣长度,单位是厘米
- petalwidth:花瓣宽度,单位是厘米
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
iris_data.head()
#自定义marker
marker = ['s','x','o']
#依次遍历三种不同的花
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()
plt.scatter参数讲解:
- x,y:散点图二维数据
- alpha:透明度,范围为[0,1],从透明到不透明
- label:代表点的名称
- marker:MarkerStyle,默认‘o’,具体含义如下:
现在探究一下为什么会出现紫色正方形,以(6.0,2.2)为例:
拆解分析:
index = c = 1
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()
index = c = 2
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()
得出结论:x号和圈重叠后就会变成正方形。
更具体地,我们可以使用pandas.plotting.scatter_matrix方法来生成所有特征的两两散点图组成的矩阵:
from sklearn.model_selection import train_test_split
import mglearn
X_train,X_test,y_train,y_test = train_test_split(iris['data'],iris['target'],test_size=0.2,random_state=0)
iris_dataframe=pd.DataFrame(X_train,columns=iris.feature_names)
grr=pd.plotting.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),marker='o',hist_kwds={
'bins':20},s=60,alpha=.8,cmap=mglearn.cm3)
接下来让我们利用Iris数据集建立预测模型:
X_train, X_test, y_train, y_test = train_test_split(
iris['data'], iris['target'], test_size=0.3,random_state=0)
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
print("Test set score: {:.2f}".format(knn.score(X_test, y_test)))
result = knn.predict(X_new)
Test set score: 0.98
测试第五行的花朵数据:
X_new = np.array([[5,3.6,1.4,0.2]])
result = knn.predict(X_new)
print('Prediction:{}'.format(result))
print('Predicted target name:{}'.format(iris_dataset['target_names'][result]))
Prediction:[0]
Predicted target name:['setosa']
4.无监督学习案例
# 生成月牙型非凸集
x, y = datasets.make_moons(n_samples=2000, shuffle=True,
noise=0.05, random_state=None)
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c,0],x[y==c,1],s=7)
plt.show()
其中,for循环的作用是先画上半圈,再画下半圈,我们也可以不使用循环采用另一种方式:
plt.scatter(x[:,0],x[:,1],c=y,s=7)
plt.show()
# 生成符合正态分布的聚类数据
x, y = datasets.make_blobs(n_samples=5000, n_features=2, centers=3)
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c, 0], x[y==c, 1],s=7)
plt.show()
对于这种聚类数据,也可以跳过循环直接画图:
plt.scatter(x[:, 0], x[:, 1],s=7,c=y)
plt.show()
题外话
为什么感觉这个jupyter notebook在和我卖萌???
参考文献
[1] 周志华,机器学习,清华大学出版社,2016
[2] 李航,统计学习方法,清华大学出版社,2012
[3] PYthon——plt.scatter各参数详解
[4] 波士顿房价预测——回归分析案例(献给初学者)
[5] 机器学习入门:从Iris数据分类开始