机器学习的三大主要任务

一、机器学习简介

1.机器学习发展历程

简单用思维导图的形式梳理一下机器学习的发展历程:
在这里插入图片描述

在过去二十年中,人类收集存储传输处理数据的能力取得了飞速提升,人类社会的各个角落都积累了大量数据,亟需能有效地对数据进行分析利用的机器算法,而机器学习顺应了大时代的这个需求,因此该学科领域很自然地取得巨大发展、受到广泛关注。

2.机器学习任务分类

机器学习大体可分为如下几类:

在这里插入图片描述

重点讲解“监督”的含义。以监督学习(supervised learning)为例,监督学习的任务是尝试学习一个数学模型,使模型能够对任意给定的输入,对其相应的输出做一个好的预测。监督指的是输出存在且已知(在分类情况下种类已知,在回归情况下范围已知)。而半监督聚类学习和无监督学习的目的是探究数据中的内部关系和结构。

二、机器学习实例代码演示

1.准备工作

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数据分类开始

猜你喜欢

转载自blog.csdn.net/Xiao_Spring/article/details/114804161
今日推荐