1 机器学习基础知识
机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。
根据数据是否有因变量,机器学习可以分为有监督和无监督学习,二者都含有数据的特征向量;但是相比无监督,有监督有因变量,有预测的结果,也就是x和y都已知,可以根据已知标签进行学习;无监督学习则无因变量,主要学习寻找数据中本身的结构和关系,比如学习数据的分布等。
根据因变量的是否连续,有监督学习又分为回归和分类:回归的因变量是连续型的;分类的因变量是分散型的。
1.1 回归
利用sklearn中内置的Boston房价数据集进行回归练习,sklearn内置的数据集都封装在datasets对象里,返回对象有:
- data:特征X的矩阵(ndarray)
- target:因变量的向量(ndarray)
- feature_names:特征名称(ndarray)
在进行回归学习前,为了对数据进行处理,先导入相关科学计算包。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")
import seaborn as sns
然后导入datasets对象,一边利用其中的数据集。
from sklearn import datasets
然后获得Boston房价数据集。
boston = datasets.load_boston() # 返回一个类似于字典的类
返回的boston对象中包含data、target和feature_names,作为字典的关键字,因此分别提取出相关内容。
X = boston.data # 获得特征矩阵
y = boston.target # 获得标签
features = boston.feature_names # 获得特征的名称
将数据组织为DataFrame格式,列用features命名,同时加入标签,命名为价格Price,同时通过head()函数查看数据的头部信息
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
boston_data.head()
各个特征的相关解释:
- CRIM:各城镇的人均犯罪率
- ZN:规划地段超过25,000平方英尺的住宅用地比例
- INDUS:城镇非零售商业用地比例
- CHAS:是否在查尔斯河边(=1是)
- NOX:一氧化氮浓度(/千万分之一)
- RM:每个住宅的平均房间数
- AGE:1940年以前建造的自住房屋的比例
- DIS:到波士顿五个就业中心的加权距离
- RAD:放射状公路的可达性指数
- TAX:全部价值的房产税率(每1万美元)
- PTRATIO:按城镇分配的学生与教师比例
- B:1000(Bk - 0.63)^2其中Bk是每个城镇的黑人比例
- LSTAT:较低地位人口
- Price:房价
通过seaborn画出CRIm特征与价格Price之间的分布关系图:
sns.scatterplot(boston_data['CRIM'],boston_data['Price'],color="r",alpha=0.6)
plt.title("Price~CRIM")
plt.show()
画出其余特征与价格之间的分布关系图:
plt.figure()
for i,f in enumerate(features[1:]):
plt.subplot(3,4,i+1)
sns.scatterplot(boston_data[f],boston_data['Price'],color="r",alpha=0.6)
plt.title("Price~"+f)
plt.show()
从中可以看出,因变量波士顿房价Price是一个连续型变量,因此可以用回归进行学习。
1.2 分类
分类问题使用鸢尾花数据集。鸢尾花数据集一共包含5个变量,其中4个特征变量,1个目标分类变量。共有150个样本,目标变量为 花的类别 其都属于鸢尾属下的三个亚属,分别是山鸢尾 (Iris-setosa),变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。包含的三种鸢尾花的四个特征,分别是花萼长度(cm)、花萼宽度(cm)、花瓣长度(cm)、花瓣宽度(cm),这些形态特征在过去被用来识别物种。
变量 | 描述 |
---|---|
sepal length | 花萼长度(cm) |
sepal width | 花萼宽度(cm) |
petal length | 花瓣长度(cm) |
petal width | 花瓣宽度(cm) |
target 鸢尾的三个亚属类别
类别 | 数量 |
---|---|
‘setosa’(0) | 50 |
‘versicolor’(1) | 50 |
‘virginica’(2) | 50 |
同样,先导入数据集,并获得数据集的特征数据、标签数据和特征名称,并查看数据信息。
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
iris_data.head()
由于数据集有三个种类,即有三种标签,因此我们用三种不同的散点来查看数据的分布情况。
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()
该数据集的因变量是一个类别变量,因此通过特征预测鸢尾花类别的问题是一个分类问题。
1.3 无监督学习
我们可以使用sklearn生成符合自身需求的数据集,下面我们用其中几个函数例子来生成无因变量的数据集:
https://scikit-learn.org/stable/modules/classes.html?highlight=datasets#module-sklearn.datasets
# 生成月牙型非凸集
from sklearn import datasets
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()
# 生成符合正态分布的聚类数据
from sklearn import datasets
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()