文章目录
1、Scikit learn 简介
Scikit learn简称sklearn,是机器学习领域中最知名的python模块之一
它包含了很多机器学习的方式:
Classification 分类
Regression 回归
Clustering 非监督分类
Dimensionality reduction 数据降维
Model Selection 模型选择
Preprocessing 数据预处理
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()
输出:
若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()
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个模块,进行验证
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()
从图中可以得知,选择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()
由图可以得知,平均方差越低越好,因此选择13~18左右的K值会最好。