2007年,数据科学家大卫·库尔纳佩(David Cournapeau)等人发起了机器学习的开源项目 sklearn,至今已逾十载。到目前为止,它已成为一款非常成熟的知名机器学习框架。
sklearn 是一款开源的 Python 机器学习库,它基于 NumPy 和 SciPy,提供了大量用于数据挖掘和分析的工具,以及支持多种算法的一系列接口。 和其他开源项目类似,sklearn 也是由社区成员自发组织和维护的。与其他开源项目不同的是,sklearn 更显“保守”。但这里的“保守”并非贬义,而是意味着“可靠”。
从磁盘中读取数据,并对数据进行预处理,如归一化、标准化、正则化、属性缩放、特征编码、插补缺失值、生成多项式特征等。
将数据随机分割成三组:训练集、验证集(有时为可选项)、测试集。
针对选取好的特征,使用训练数据来构建模型,即拟合数据,寻找最优的模型参数。这里的拟合数据,主要是指使用各种机器学习算法来学习数据中的特征,拟合出损失函数最小化参数。
使用验证集的数据接入模型。我们将模型在验证集上的表现作为模型参数优化和选择的依据。常用的方法有 Holdout 验证、留一验证(leave-one-out cross-validation)等。
在优化模型的参数以后,使用测试数据验证模型的表现,可以评估模型的泛化性能。
正所谓“养兵千日,用兵一时”。模型训练完毕后,就该“上战场”了,在全新数据集上进行预测。 所有机器学习算法的终极价值,都体现在对新数据的预测上。过往的历史数据(即训练数据)的价值,就在于“喂养”出一个靠谱的数据预言家,对我们从未接触过的新数据做出预测,从而指导我们未来的行为方向,实现基于数据的“洞察”。
当我们不断使用更多的数据(包括预测的新数据)时,就会得到反馈,然后根据反馈重新调整数据使用策略,包括收集更为全面的数据、使用不同的特征、调整过往模型参数等,以此来迭代优化模型。实际上,以上 1~7 可以算作一个无限循环、迭代升级的过程。
sklearn 的功能主要分为六大部分:分类、回归、聚类、数据降维、模型选择和数据预处理。
简单来说,如果定性输出预测(预测变量是离散值),可称之为分类(classification),比如预测花的品类、顾客是否购买商品等。sklearn 中已实现的经典分类算法包括:支持向量机(SVM)、最近邻算法、Logisti c回归、随机森林、决策树,以及多层感知器(Multilayer Perceptron,MLP)等。
相比而言,如果定量输出预测(预测变量是连续值),则称之为回归(regression),比如预测花的长势、房价的涨势等。目前 sklearn 中已经实现的回归算法包括:线性回归、支持向量回归(SVR)、岭回归、Lasso 回归、贝叶斯回归等。常见的应用场景有股价预测等。
聚类(clustering)的功能是将相似的对象自动分组。sklearn 中常用的聚类算法包括:k 均值聚类、谱聚类(spectral clustering)、均值漂移(Mean shift)等。常见的应用场景有客户细分、实验结果分组及数据压缩等。
数据降维(dimension reduction)的目的在于,减少要考虑的随机变量的数量。sklearn中常见的数据降维算法有主成分分析(Principal Components Analysis,PCA)、特征选择(feature selection)、非负矩阵分解(non-negative matrix factorization)等。常见的应用场景包括数据压缩、模型优化等。
模型选择是指评估与验证模型,对模型参数进行选择与平衡。sklearn 提供了很多有用的模块,可实现许多常见功能,包括模型度量(metrics)、网格搜索(grid search)、交叉验证(cross validation)等。其目的在于,通过调整模型参数来提高模型性能(预测准确度、泛化误差等)。
数据预处理的功能在于,把输入数据(如文本、图形图像等)转换为机器学习算法适用的数据,主要包括数据特征的提取和归一化。在 sklearn 中,常用的模块有数据预处理(preprocessing)、特征抽取(feature extraction)等。
#!/usr/bin/env python
# coding: utf-8
# In[4]:
from sklearn.datasets import load_boston
boston = load_boston()
print(boston.data)
# In[14]:
print(boston.data.shape)
print(boston.keys())
print(boston.target.shape)
print(boston.filename)
print(boston.feature_names)
# print(boston.DESCR)
# In[19]:
import pandas as pd
data=pd.DataFrame(boston.data)
print(data.head())
# In[23]:
data.columns=boston.feature_names
data.head()
# In[24]:
# 分割数据集,但给出的数据集已经将价格去掉,就不需要手动分割了,下面只写一个分割数据的示例
X=data.drop('B',axis=1)
y=boston.target
# In[27]:
# 引入分割数据集的模块,将这个数据分成两部分,一部分用来训练,另一部分用来测试模型
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0) #test_size参数表示测试集的大小是30%,random_state参数表示数据随机
print(X_test.shape)
print(y_test.shape)
X_test
# In[30]:
# 导入训练模型模块,这里导入的是线性回归模型
from sklearn.linear_model import LinearRegression
LR=LinearRegression() #生成模型
LR.fit(X_train,y_train)
y_pred=LR.predict(X_test)
LR.coef_ #每个特征值的权值
# In[34]:
# 绘制真实值和预测值的散点图,红色线是标准
import matplotlib.pylab as plt
import numpy as np
plt.scatter(y_test, y_pred)
x=np.arange(0,50)
y=x
plt.plot(x,y,color='red')
plt.show()
# In[35]:
# 评估模型
from sklearn import metrics
mse = metrics.mean_squared_error(y_test, y_pred)
print(mse)