Sklearn学习笔记

1、Scikit learn 简介

Scikit learn简称sklearn,是机器学习领域中最知名的python模块之一
它包含了很多机器学习的方式:
Classification 分类
Regression 回归
Clustering 非监督分类
Dimensionality reduction 数据降维
Model Selection 模型选择
Preprocessing 数据预处理

Sklearn 官网提供了一个流程图, 蓝色圆圈内是判断条件,绿色方框内是可以选择的算法:
Sklearn学习笔记
从 START 开始,首先看数据的样本是否 >50,小于则需要收集更多的数据。由图中,可以看到算法有四类,分类,回归,聚类,降维。

2、通用学习模式

Sklearnm模型:分类,回归,聚类,降维
流程:建立模型-训练-预测

(2)数据集

Sklearn 本身就有很多数据库,可以用来练习。 以 Iris 的数据为例,这种花有四个属性,花瓣的长宽,茎的长宽,根据这些属性把花分为三类。我们要用分类器 去把四种类型的花分开。
例子:用KNN classifier,就是选择几个临近点,综合它们做个平均来作为预测值。

(3)代码

from sklearn import datasets #导入数据集
from sklearn.model_selection import train_test_split  #将训练集和测试集分开
from sklearn.neighbors import KNeighborsClassifier #引入KNN

iris = datasets.load_iris()
iris_X = iris.data   #属性
iris_y = iris.target #类别
#将数据集分为训练集和测试集,test_size=0.3表示测试集占30%
X_train, X_test, y_train, y_test = train_test_split(
    iris_X, iris_y, test_size=0.3)

knn = KNeighborsClassifier()#定义模块方式
knn.fit(X_train, y_train)#用fit训练数据,knn即是训练好的模型
#将模型预测值与真实值进行对比
print(knn.predict(X_test))
print(y_test)

(4)输出结果

[0 2 0 1 2 1 0 2 2 1 0 1 0 2 1 1 0 0 0 0 1 2 2 0 1 0 0 2 2 2 1 0 2 2 2 0 2
 0 0 0 2 1 2 2 1]  
[0 2 0 1 2 1 0 2 2 1 0 1 0 2 1 1 0 0 0 0 1 2 2 0 1 0 0 2 2 2 1 0 2 2 2 0 2
 0 0 0 2 1 2 2 1]

3、sklearn强大数据库

例如:Bonston房价、糖尿病、数字、Iris花

(1)示例

以房价为例,线性回归为模型
代码:

from sklearn import datasets
from sklearn.linear_model import LinearRegression #线性回归
loaded_data = datasets.load_boston()
data_X = loaded_data.data
data_y = loaded_data.target
model = LinearRegression()
model.fit(data_X, data_y)
#这里用X的前4个来预测,同时与真实值进行比较
print(model.predict(data_X[:4, :]))
print(data_y[:4])

输出结果:

[ 30.00821269  25.0298606   30.5702317   28.60814055]
[ 24.   21.6  34.7  33.4]

(2)也可以生成虚拟的数据

例如用来训练线性回归模型的数据,可以用函数来生成。

from sklearn import datasets
import matplotlib.pyplot as plt

#建立100个样本,提供一个变量(属性),一个y值
X, y = datasets.make_regression(n_samples=100, n_features=1, n_targets=1, noise=10)
#可视化散点图
plt.scatter(X, y)
plt.show()

输出:
Sklearn学习笔记
若noise值越大的话,点就越离散

四、sklearn的属性和功能

from sklearn import datasets
from sklearn.linear_model import LinearRegression

loaded_data = datasets.load_boston()
data_X = loaded_data.data
data_y = loaded_data.target

model = LinearRegression()

#fit和predict属于Model的功能,用来训练模型
model.fit(data_X, data_y)
print(model.predict(data_X[:4, :]))

#coef_和intercept属于Model的属性,分别输出模型的斜率和截距
print(model.coef_)
print(model.intercept_)

#get_params也是功能,可以取出之前定义的参数
print(model.get_params())

#可以进行打分,输出精确度
print(model.score(data_X, data_y))

结果:

[ 30.00821269  25.0298606   30.5702317   28.60814055]

#表示每一个特征值函数的斜率,比如房子的面积、地段等
[ -1.07170557e-01   4.63952195e-02   2.08602395e-02   2.68856140e+00
  -1.77957587e+01   3.80475246e+00   7.51061703e-04  -1.47575880e+00
   3.05655038e-01  -1.23293463e-02  -9.53463555e-01   9.39251272e-03
  -5.25466633e-01]
  
36.4911032804

{'copy_X': True, 'fit_intercept': True, 'n_jobs': 1, 'normalize': False}

0.740607742865

5、正则化

(1)示例

from sklearn import preprocessing #标准化数据模块
import numpy as np

#建立Array,每一列代表一个特征参数,每一行代表一个样本
a = np.array([[10, 2.7, 3.6],
              [-100, 5, -2],
              [120, 20, 40]], dtype=np.float64)

#将normalized后的a打印出。
# scale进行的操作是按列减去均值, 除以方差, 因此数据的均值为0, 方差为1
print(preprocessing.scale(a))

输出结果:

[[ 0.         -0.85170713 -0.55138018]
 [-1.22474487 -0.55187146 -0.852133  ]
 [ 1.22474487  1.40357859  1.40351318]]

(2)数据标准化对机器学习的影响

import matplotlib.pyplot as plt

#生成具有2种属性的300笔数据
X, y = make_classification(
    n_samples=300, n_features=2,
    n_redundant=0, n_informative=2,
    random_state=22, n_clusters_per_class=1,
    scale=100)

#可视化数据
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()

Sklearn学习笔记

1)不进行归一化


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
clf = SVC()
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))

结果:0.4

2)进行归一化

X = preprocessing.scale(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
clf = SVC()
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))

结果:0.966666666667

6、交叉验证

在神经网络的训练当中,神经网络可能会因为各种各样的问题, 出现学习的效率不高, 或者是因为干扰太多, 学到最后并没有很好的学到规律。因此需要评价、检验学习到的神经网络。

(1)Model交叉验证法

将数据划分为5个模块,进行验证
Sklearn学习笔记


from sklearn.datasets import load_iris # iris数据集
from sklearn.model_selection import train_test_split # 分割数据模块
from sklearn.neighbors import KNeighborsClassifier # K最近邻(kNN,k-NearestNeighbor)分类算法
from sklearn.cross_validation import cross_val_score # K折交叉验证模块

#加载iris数据集
iris = load_iris()
X = iris.data
y = iris.target
#分割数据train和test数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)
#建立模型
knn = KNeighborsClassifier()
#训练模型
knn.fit(X_train, y_train)
#使用K折交叉验证模块,分为了五个模块进行验证
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')
#将5次的预测准确率打印出
print(scores)
#将5次的预测准确平均率打印出
print(scores.mean())

结果:

[ 0.96666667  1.          0.93333333  0.96666667  1.        ]
0.973333333333

(2)以准确率判断分类模型的好坏

from sklearn.datasets import load_iris # iris数据集
from sklearn.model_selection import train_test_split # 分割数据模块
from sklearn.neighbors import KNeighborsClassifier # K最近邻(kNN,k-NearestNeighbor)分类算法
from sklearn.cross_validation import cross_val_score # K折交叉验证模块
import matplotlib.pyplot as plt #可视化模块

#加载iris数据集
iris = load_iris()
X = iris.data
y = iris.target
#分割数据train和test数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)
#建立模型
knn = KNeighborsClassifier()
#训练模型
knn.fit(X_train, y_train)
#建立测试参数集
k_range = range(1, 31)

k_scores = []

#由迭代的方式来计算不同参数对模型的影响,并返回交叉验证后的平均准确率
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)#周围有k个近邻,计算均值得到knn
    scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')#10个模块进行验证
    k_scores.append(scores.mean())

#可视化数据
plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated Accuracy')
plt.show()

Sklearn学习笔记
从图中可以得知,选择12~18的k值最好。高过18之后,准确率开始下降则是因为过拟合(Over fitting)的问题

(3)以平均方差判断回归模型的好坏

from sklearn.datasets import load_iris # iris数据集
from sklearn.model_selection import train_test_split # 分割数据模块
from sklearn.neighbors import KNeighborsClassifier # K最近邻(kNN,k-NearestNeighbor)分类算法
from sklearn.cross_validation import cross_val_score # K折交叉验证模块
import matplotlib.pyplot as plt #可视化模块

#加载iris数据集
iris = load_iris()
X = iris.data
y = iris.target
#分割数据train和test数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)
#建立模型
knn = KNeighborsClassifier()
#训练模型
knn.fit(X_train, y_train)
#建立测试参数集
k_range = range(1, 31)

k_scores = []

#由迭代的方式来计算不同参数对模型的影响,并返回交叉验证后的平均准确率
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)#周围有k个近邻,计算均值得到knn
    loss = cross_val_score(knn, X, y, cv=10, scoring='mean_squared_error')#10个模块进行验证
    k_scores.append(loss.mean())

#可视化数据
plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated MSE')
plt.show()

Sklearn学习笔记由图可以得知,平均方差越低越好,因此选择13~18左右的K值会最好。