- results
- .gitignore
- 1Numpy 基础.ipynb
- 2Matplotlib 基础.ipynb
- 3Pandas 基础.ipynb
- 4Sklearn 基础.ipynb
- 5决策树.ipynb
- 6神经网络学习.ipynb
- _overview.md
- _readme.ipynb
- coding_here.ipynb
- essay1_ch.txt
- essay1_en.txt
- essay2_ch.txt
- essay2_en.txt
- essay3_ch.txt
- essay3_en.txt
- iris.csv
- mnist.npz
- mnist.py
- model.h5
- myModel.pkl
- out.txt
- pie.png
- Pokemon.csv
- search.py
- 练习题-matplotlib.ipynb
- 练习题-Numpy.ipynb
- 练习题-Pandas.ipynb
- 练习题-scikit-learn.ipynb
4Sklearn 基础.ipynb @96fc089 — view markup · raw · history · blame
Scikit-learn基础¶
- Python 语言的机器学习工具
Scikit-learn
包括大量常用的机器学习算法Scikit-learn
文档完善,容易上手
机器学习算法¶
机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。
由图中,可以看到机器学习 sklearn
库的算法主要有四类:分类,回归,聚类,降维。其中:
- 常用的回归:线性、决策树、
SVM
、KNN
;
集成回归:随机森林、Adaboost
、GradientBoosting
、Bagging
、ExtraTrees
- 常用的分类:线性、决策树、
SVM
、KNN
、朴素贝叶斯;
集成分类:随机森林、Adaboost
、GradientBoosting
、Bagging
、ExtraTrees
- 常用聚类:
k
均值(K-means
)、层次聚类(Hierarchical clustering
)、DBSCAN
- 常用降维:
LinearDiscriminantAnalysis
、PCA
这个流程图代表:蓝色圆圈是判断条件,绿色方框是可以选择的算法,我们可以根据自己的数据特征和任务目标去找一条自己的操作路线。
sklearn
数据集¶
sklearn.datasets.load_*()
- 获取小规模数据集,数据包含在
datasets
里
- 获取小规模数据集,数据包含在
sklearn.datasets.fetch_*(data_home=None)
- 获取大规模数据集,需要从网络上下载,函数的第一个参数是
data_home
,表示数据集下载的目录,默认是/scikit_learn_data/
- 获取大规模数据集,需要从网络上下载,函数的第一个参数是
sklearn
常见的数据集如下:
数据集名称 | 调用方式 | 适用算法 | 数据规模 | ||
---|---|---|---|---|---|
小数据集 | 波士顿房价 | load_boston() | 回归 | 506*13 | |
小数据集 | 鸢尾花数据集 | load_iris() | 分类 | 150*4 | |
小数据集 | 糖尿病数据集 | load_diabetes() | 回归 | 442*10 | |
大数据集 | 手写数字数据集 | load_digits() | 分类 | 5620*64 | |
大数据集 | Olivetti脸部图像数据集 | fetch_olivetti_facecs | 降维 | 400*64*64 | |
大数据集 | 新闻分类数据集 | fetch_20newsgroups() | 分类 | - | |
大数据集 | 带标签的人脸数据集 | fetch_lfw_people() | 分类、降维 | - | |
大数据集 | 路透社新闻语料数据集 | fetch_rcv1() | 分类 | 804414*47236 |
from sklearn.datasets import load_iris
# 获取鸢尾花数据集
iris = load_iris()
print("鸢尾花数据集的返回值:\n", iris.keys())
数据预处理¶
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。常见的有数据标准化、数据二值化、标签编码、独热编码等。
# 导入内建数据集
from sklearn.datasets import load_iris
# 获取鸢尾花数据集
iris = load_iris()
# 获得 ndarray 格式的变量 X 和标签 y
X = iris.data
y = iris.target
# 获得数据维度
n_samples, n_features = iris.data.shape
print(n_samples, n_features)
数据标准化¶
数据标准化和归一化是将数据映射到一个小的浮点数范围内,以便模型能快速收敛。
标准化有多种方式,常用的一种是min-max标准化(对象名为MinMaxScaler),该方法使数据落到[0,1]区间:
$x^{'}=\frac{x-x_{min}}{x_{max} - x_{min}}$
# min-max标准化
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler()
sc.fit(X)
results = sc.transform(X)
print("放缩前:", X[1])
print("放缩后:", results[1])
另一种是Z-score标准化(对象名为StandardScaler),该方法使数据满足标准正态分布:
$x^{'}=\frac{x-\overline {X}}{S}$
# Z-score标准化
from sklearn.preprocessing import StandardScaler
#将fit和transform组合执行
results = StandardScaler().fit_transform(X)
print("放缩前:", X[1])
print("放缩后:", results[1])
归一化(对象名为Normalizer,默认为L2归一化):
$x^{'}=\frac{x}{\sqrt{\sum_{j}^{m}x_{j}^2}}$
# 归一化
from sklearn.preprocessing import Normalizer
results = Normalizer().fit_transform(X)
print("放缩前:", X[1])
print("放缩后:", results[1])
数据二值化¶
使用阈值过滤器将数据转化为布尔值,即为二值化。使用Binarizer对象实现数据的二值化:
# 二值化,阈值设置为3
from sklearn.preprocessing import Binarizer
results = Binarizer(threshold=3).fit_transform(X)
print("处理前:", X[1])
print("处理后:", results[1])
标签编码¶
使用 LabelEncoder 将不连续的数值或文本变量转化为有序的数值型变量:
# 标签编码
from sklearn.preprocessing import LabelEncoder
LabelEncoder().fit_transform(['apple', 'pear', 'orange', 'banana'])
独热编码¶
对于无序的离散型特征,其数值大小并没有意义,需要对其进行one-hot编码,将其特征的m个可能值转化为m个二值化特征。可以利用OneHotEncoder对象实现:
# 独热编码
from sklearn.preprocessing import OneHotEncoder
results = OneHotEncoder().fit_transform(y.reshape(-1,1)).toarray()
print("处理前:", y)
print("处理后:", results[1])
数据集的划分¶
机器学习一般的数据集会划分为两个部分:
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
划分比例:
- 训练集:70% 80% 75%
- 测试集:30% 20% 25%
sklearn.model_selection.train_test_split(x, y, test_size, random_state )
x
:数据集的特征值y
: 数据集的标签值test_size
: 如果是浮点数,表示测试集样本占比;如果是整数,表示测试集样本的数量。random_state
: 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。return
训练集的特征值x_train
测试集的特征值x_test
训练集的目标值y_train
测试集的目标值y_test
。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据集
iris = load_iris()
# 对数据集进行分割
# 训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,test_size=0.3, random_state=22)
print("x_train:", X_train.shape)
print("y_train:", y_train.shape)
print("x_test:", X_test.shape)
print("y_test:", y_test.shape)
定义模型¶
在 scikit-learn
中,所有模型都有同样的接口供调用。监督学习模型都具有以下的方法:
fit
:对数据进行拟合。set_params
:设定模型参数。get_params
:返回模型参数。predict
:在指定的数据集上预测。score
:返回预测器的得分。
鸢尾花数据集是一个分类任务,故以决策树模型为例,采用默认参数拟合模型,并对验证集预测。
# 决策树分类器
from sklearn.tree import DecisionTreeClassifier
# 定义模型
model = DecisionTreeClassifier()
# 训练模型
model.fit(X_train, y_train)
# 在测试集上预测
model.predict(X_test)
# 测试集上的得分(默认为准确率)
model.score(X_test, y_test)
scikit-learn
中所有模型的调用方式都类似。
模型评估¶
评估模型的常用方法为 K
折交叉验证,它将数据集划分为 K
个大小相近的子集(K
通常取 10
),每次选择其中(K-1
)个子集的并集做为训练集,余下的做为测试集,总共得到 K
组训练集&测试集,最终返回这 K
次测试结果的得分,取其均值可作为选定最终模型的指标。
# 交叉验证
from sklearn.model_selection import cross_val_score
cross_val_score(model, X, y, scoring=None, cv=10)
注意:由于之前采用了 train_test_split
分割数据集,它默认对数据进行了洗牌,所以这里可以直接使用 cv=10
来进行 10
折交叉验证(cross_val_score
不会对数据进行洗牌)。如果之前未对数据进行洗牌,则要搭配使用 KFold
模块:
from sklearn.model_selection import KFold
n_folds = 10
kf = KFold(n_folds, shuffle=True).get_n_splits(X)
cross_val_score(model, X, y, scoring=None, cv = kf)
保存与加载模型¶
在训练模型后可将模型保存,以免下次重复训练。保存与加载模型使用 sklearn
的 joblib
:
from sklearn.externals import joblib
# 保存模型
joblib.dump(model,'myModel.pkl')
# 加载模型
model=joblib.load('myModel.pkl')
print(model)
下面我们用一个小例子来展示如何使用 sklearn
工具包快速完成一个机器学习项目。
采用逻辑回归模型实现鸢尾花分类¶
线性回归
在介绍逻辑回归之前先介绍一下线性回归,线性回归的主要思想是通过历史数据拟合出一条直线,因变量与自变量是线性关系,对新的数据用这条直线进行预测。 线性回归的公式如下:
$y = w_{0}+w_{1}x_{1}+...+w_{n}x_{n}=w^{T}x+b$
逻辑回归
逻辑回归是一种广义的线性回归分析模型,是一种预测分析。虽然它名字里带回归,但实际上是一种分类学习方法。它不是仅预测出“类别”, 而是可以得到近似概率预测,这对于许多需要利用概率辅助决策的任务很有用。普遍应用于预测一个实例是否属于一个特定类别的概率,比如一封 email
是垃圾邮件的概率是多少。 因变量可以是二分类的,也可以是多分类的。因为结果是概率的,除了分类外还可以做 ranking model
。逻辑的应用场景很多,如点击率预测(CTR
)、天气预测、一些电商的购物搭配推荐、一些电商的搜索排序基线等。
sigmoid
函数
Sigmoid
函数,呈现S型曲线,它将值转化为一个接近 0
或 1
的 y
值。
$y = g(z)=\frac{1}{1+e^{-z}}$ 其中:$z = w^{T}x+b$
鸢尾花数据集

sklearn.datasets.load_iris()
:加载并返回鸢尾花数据集
Iris
鸢尾花卉数据集,是常用的分类实验数据集,由 R.A. Fisher
于 1936
年收集整理的。其中包含 3
种植物种类,分别是山鸢尾(setosa
)变色鸢尾(versicolor
)和维吉尼亚鸢尾(virginica
),每类 50
个样本,共 150
个样本。
变量名 | 变量解释 | 数据类型 |
---|---|---|
sepal_length | 花萼长度(单位cm) | numeric |
sepal_width | 花萼宽度(单位cm) | numeric |
petal_length | 花瓣长度(单位cm) | numeric |
petal_width | 花瓣宽度(单位cm) | numeric |
species | 种类 | categorical |
1.获取数据集及其信息¶
from sklearn.datasets import load_iris
# 获取鸢尾花数据集
iris = load_iris()
print("鸢尾花数据集的返回值:\n", iris.keys())
print("鸢尾花的特征值:\n", iris["data"][1])
print("鸢尾花的目标值:\n", iris.target)
print("鸢尾花特征的名字:\n", iris.feature_names)
print("鸢尾花目标值的名字:\n", iris.target_names)
# 取出特征值
X = iris.data
y = iris.target
2.数据划分¶
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.1, random_state=0)
3.数据标准化¶
from sklearn.preprocessing import StandardScaler
transfer = StandardScaler()
X_train = transfer.fit_transform(X_train)
X_test = transfer.transform(X_test)
4.模型构建¶
from sklearn.linear_model import LogisticRegression
estimator = LogisticRegression(penalty='l2',solver='newton-cg',multi_class='multinomial')
estimator.fit(X_train,Y_train)
5.模型评估¶
print("\n得出来的权重:", estimator.coef_)
print("\nLogistic Regression模型训练集的准确率:%.1f%%" %(estimator.score(X_train, Y_train)*100))
6. 模型预测¶
from sklearn import metrics
y_predict = estimator.predict(X_test)
print("\n预测结果为:\n", y_predict)
print("\n比对真实值和预测值:\n", y_predict == Y_test)
# 预测的准确率
accuracy = metrics.accuracy_score(Y_test, y_predict)
print("\nLogistic Regression 模型测试集的正确率:%.1f%%" %(accuracy*100))
7.交叉验证¶
from sklearn.model_selection import cross_val_score
import numpy as np
scores = cross_val_score(estimator, X, y, scoring=None, cv=10) #cv为迭代次数。
print("\n交叉验证的准确率:",np.round(scores,2)) # 打印输出每次迭代的度量值(准确度)
print("\n交叉验证结果的置信区间: %0.2f%%(+/- %0.2f)" % (scores.mean()*100, scores.std() * 2)) # 获取置信区间。(也就是均值和方差)