文章内容参考:https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning
机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。数据通常由一组向量组成,这组向量中的每个向量都是一个样本,用来表示一个样本,其中=1,2,3,...,,共N个样本,每个样本=(1,2,...,,),共p+1个维度,前p个维度的每个维度我们称为一个特征,最后一个维度称为因变量(响应变量)。特征用来描述影响因变量的因素,如:要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本,一列表示一个特征。
图1 数据的格式
根据数据是否有因变量,机器学习的任务可分为:有监督学习和无监督学习。
简单点来说,有监督学习即数据有y,无监督学习没有y。
根据因变量的是否连续,有监督学习又分为回归和分类:
图2 机器学习的分类
在学习机器学习中,我们经常使用scikit-learn简称sklearn工具库来探索机器学习项目,下面我们开始使用sklearn来演示这几个具体的概念。
在回归分析中,使用sklearn内置数据集Boston房价数据集。sklearn中所有内置数据集都封装在datasets对象内: 返回的对象有:
from sklearn import datasets #从sklearn中导入datasets,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
boston_data.head() #展示前5行数据
图3 Boston数据前5行内容
该数据中各个特征的相关解释:
#以“NOX”和“Price”作为数据绘图
sns.scatterplot(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6)
plt.title("Price~NOX")
plt.show()
图4 以NOX和Price为数据作图
根据图可以看出,因变量y是一个连续型变量,所以以该数据构建的模型应为回归型模型。
分类数据的例子使用经典的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()
图5 鸢尾花数据前5行
该数据为分类型数据,因变量y实际上有三种类型,0,1,2,用来表示不同类型的鸢尾花。但是该数据的前五行无法看出该数据的类型,把数据扩展到100行试试:
图6 鸢尾花数据前100行
我们发现,在该数据的后面,出现了因变量y为1的情况。
鸢尾花数据集各个特征的相关解释:
使用鸢尾花数据集绘图:
# 可视化特征
marker = ['s','x','o']
#其中“c”表示鸢尾花类型(有0,1,2,3这种种类)
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()
图7 鸢尾花数据集可视化结果
可以看到:每种不同的颜色和点的样式为一种类型的鸢尾花,数据集有三种不同类型的鸢尾花。因此因变量是一个类别变量,因此通过特征预测鸢尾花类别的问题是一个分类问题。
无监督学习主要是用来探索数据之间的可能相关性特征,找出其中有价值的信息。
可以使用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()
图8 月牙非凸集
# 生成符合正态分布的聚类数据
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()
图9 正态分布数据