参考Datawhale集成学习给出的思路。机器学习的“左膀右臂”——模型和数据,我们无非是应用模型来分析数据规律,以期望预测数据。在机器学习语境下,数据集通常表示为一组向量,每条数据(样本)就是该组向量中的一个向量。我们用 x i x_i xi来表示一个样本,其中 i = 1 , 2 , 3 , . . . , N i=1,2,3,...,N i=1,2,3,...,N,每个样本 x i = ( x i 1 , x i 2 , . . . , x i p , y i ) x_i = (x_{i1}, x_{i2}, . . . , x_{ip}, y_i) xi=(xi1,xi2,...,xip,yi)共p+1个维度,前p个维度的每个维度我们称为一个特征,最后一个维度我们称为因变量(响应变量)。特征用来描述影响因变量的因素,如:我们要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本,一列表示一个特征。根据数据是否有因变量,机器学习的任务可分为:有监督学习和无监督学习。
导入包
# 引入相关科学计算包
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类中,关于Boston房价数据集的接口文档可以戳此链接。在此,我们只举出与此实例相关的返回对象:
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 #在数据表末端新增一列因变量————价格price
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:房价
取一特征NOX
,与因变量Price
一起构建散点图。
sns.scatterplot(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6)
plt.title("Price~NOX")
plt.show()
seaborn.scatterplot
接口参数说明:
- x,y(接受vectors or keys):(x,y)构建一个坐标点
- color:坐标点颜色
- alpha:坐标点透明度
我们可以看到,数据给定任务所需要的因变量,因变量为波士顿房价Price是一个连续型变量,所以这是一个回归的例子。
下面来看一个分类的例子,数据集为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
iris_data.head()
- sepal length (cm):花萼长度(厘米)
- sepal width (cm):花萼宽度(厘米)
- petal length (cm):花瓣长度(厘米)
- petal width (cm):花瓣宽度(厘米)
接下来可视化特征,观察图像能够明显发现分类问题的特征。具体操作如下,数据集有三种不同类型的鸢尾花,意味着target=0,1,2
,我们只需要遍历这三个类别,将三个类别所属的坐标点集绘制即可,并做记号区分类别。
关于matplotlib.pyplot.scatter
接口参数信息如下:
- x, y:(x,y)构成坐标点。可以取单一float值,也可以取向量(这里取的是属于同一类型的向量)。
- s:坐标点的大小。
- marker:坐标点样式,可以看详细图解。
- alpha:坐标点透明度。
- label:与
plt.legend()
搭配食用。
plt.legend()
的主要功能为常见图例。要创建带有图例的散点图,可以使用循环并为每个项目创建一个散点图以出现在图例中并相应地设置label
。
# 可视化特征
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()
np.unique()
去除数组中的重复数字,并进行排序之后输出。
enumerate()
函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。以下是语法:
enumerate(sequence, [start=0])
sequence:一个序列、迭代器或其他支持迭代对象。
start:下标起始位置。
返回 enumerate(枚举) 对象。
如果仍不理解,直接在当前代码print一下即可。
print(index, c)
无监督学习是指从无标注数据中学习预测模型的机器学习问题。无标注数据是自然得到的数据,预测模型表示数据的类别、转换或概率。无监督学习的本质是学习数据中的统计规律或潜在结构。
我们可以使用sklearn生成符合自身需求的数据集,下面我们用其中几个函数例子来生成无因变量的数据集:地址
make_moons
接口参数说明:
- n_samples(int or tuple of shape (2,), dtype=int, default=100):如果为int,则生成的总点数。如果是两个元素的元组,则两个月亮中每个月亮的点数。
- shuffle(bool, default=True):打乱样本顺序。
- noise(float, default=None):加入高斯噪音。(原文:Standard deviation of Gaussian noise added to the data.)
- random_state(int, RandomState instance or None, default=None):类似于随机数种子,保证每次都分割一样的训练集和测试集。因为同一算法模型在不同的训练集和测试集的会得到不同的准确率,无法调参。
返回值如下:
- X(维度:n_samples x 2):生成样本。(ndarray)
- Y(维度:n_samples x 1):每个样本对应的样本标签。(ndarray)
from sklearn import datasets
x, y = datasets.make_moons(n_samples=2000, shuffle=True,
noise=0.1, random_state=None)
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c,0],x[y==c,1],s=9)
plt.show()
关于如何合理添加高斯噪音是一个值得探讨的问题。这里给出noise=0.1
的结果。
noise=0.05
make_blobs
# 生成符合正态分布的聚类数据
from sklearn import datasets
x, y = datasets.make_blobs(n_samples=5000, n_features=2, centers=3)
print(x,y)
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c, 0], x[y==c, 1],s=7)
plt.show()
- Datawhale集成学习项目地址
- Datawhale的Pandas教程
- 统计学习方法·李航
- matplotlib.pyplot.scatter接口文档
- seaborn.scatterplot接口文档
- sklearn.datasets.make_blobs接口文档
- sklearn.datasets.make_moons接口文档
- np.unique( )
- matplotlib.markers参数选择
- Scatter plots with a legend