安装SciKit Learn
pip install numpy
pip install sklearn
pip install matplotlib
sklean中自带的数据
- iris 鸢尾属植物数据(分类)
from sklearn import datasets
iris = datasets.load_iris()
- Boston房价信息(线性回归)
from sklearn import datasets
boston = datasets.load_boston()
- 等等
分类器实例
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
iris = datasets.load_iris() ## 加载数据
iris_X = iris.data ## X坐标,叶子长宽等属性
iris_Y = iris.target ## Y坐标, 植物品种[0, 1, 2]
X_tain, X_test, Y_train, Y_test = train_test_split(iris_X, iris_Y, test_size=0.3) ## 将数据中的70%做为训练数据,30%作为测试数据
knn = KNeighborsClassifier() ## 使用Neighbors分类器模型
knn.fit(X_tain, Y_train) ## 使用数据中的70%对模型进行训练
print(knn.predict(X_test)) ## 对剩下的30%的属性进行预测品种
print(Y_test) ## 剩下的30%属性对应的真实品种值
print(knn.score(X_test, Y_test)) ## 对该模型中的30%预测结果与真实结果比较,对模型准确度打分
以上对该分类器实例得到的准确度达到93%以上
线性回归实例
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt
boston = datasets.load_boston() ## 加载波士顿房价信息
boston_X = boston.data ## X坐标,房价相关属性:大小,位置等
boston_Y = boston.target ## 房价
X_train, X_test, Y_train, Y_test = train_test_split(boston_X, boston_Y, test_size=0.3) ##将数据中的70%作为训练数据,30%作为测试数据
model = LinearRegression() ## 使用LinearRegression线性回归模型
model.fit(X_train, Y_train) ## 对模型进行训练
Y_pre = model.predict(X_test) ## 对30%的测试数据进行预测
# plt.scatter(X_test[:,0], Y_test) ## 在图上展示与第一个属性相关图表
# plt.scatter(X_test[:,0], Y_pre)
# plt.show()
# y = model.coef_ * X + model.intercept_
print(model.coef_) ## 得到对于每个属性的斜率
print(model.intercept_) ## 得到在Y坐标的截距
print(model.score(X_test, Y_test)) ## 对该模型中的30%预测结果与真实结果比较,对模型准确度打分
以上对房价预测得到的准确度只有60%左右
Normalization(Scale)
如果X自变量的范围很大
,会影响到数据的预测精确度,可以先对X坐标进行压缩,再对数据进行训练预测
from sklearn import preprocessing
import numpy as np
data = np.array([[10, 23, 3], [-100, 5, 2], [150, 23, 4]], dtype=np.float64)
print(data)
print(preprocessing.scale(data))
## 执行结果
[[ 10. 23. 3.]
[-100. 5. 2.]
[ 150. 23. 4.]]
[[-0.09774528 0.70710678 0. ]
[-1.17294338 -1.41421356 -1.22474487]
[ 1.27068866 0.70710678 1.22474487]]
更适合机器学习进行处理
Cross Validation 交叉验证
对一个模型打分,之前使用score方法进行评分,但是它只能对于一部分数据作为测试数据进行比较。使用cross_val_score的方法,会将数据分成多组训练数据与测试数据,最后取平均值的方式,对模型打分更准确。
交叉验证
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
iris = datasets.load_iris() ## 加载数据
iris_X = iris.data ## X坐标,叶子长宽等属性
iris_Y = iris.target ## Y坐标, 植物品种[0, 1, 2]
knn= KNeighborsClassifier() ## 使用KNeighborsClassifier分类模型
scores = cross_val_score(knn, iris_X, iris_Y, cv=5, scoring='accuracy') ## 将数据分为5份,其中4份为训练数据,1份为测试数据
print(scores.mean())
这样得到的评分会更准确。
对于KNeighborsClassifier模型训练时,设置n_neighbors的值多少更合适,可以对它的值进行遍历,根据cross_val_score的值得到最合适的配置参数
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
from matplotlib import pyplot as plt
iris = datasets.load_iris() ## 加载数据
iris_X = iris.data ## X坐标,叶子长宽等属性
iris_Y = iris.target ## Y坐标, 植物品种[0, 1, 2]
k_range = range(1, 31)
max_score = []
for k in k_range:
knn= KNeighborsClassifier(n_neighbors=k) ## 使用KNeighborsClassifier分类模型
scores = cross_val_score(knn, iris_X, iris_Y, cv=10) ## 进行交叉验证打分 这个值(准确度)是越大,越准确
max_score.append(scores.mean()) ## 计算交叉验证打分的平均值
## 将数据在图中打印出来,显目地看到不同n_neighbors值对结果的影响
plt.plot(k_range, max_score)
plt.xlabel(u'n_neighbors Value')
plt.ylabel(u'Score')
plt.show()
不同n_neighbors值对就的评分
从图中可以我们选择k值,选择12到18之前的值,会有更准确的预测。
过度学习(随着训练数据越多,准确度越低)
learning_curve参数固定时,随着训练数据增多,查看准确度
import numpy as np
from sklearn.model_selection import learning_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
from matplotlib import pyplot as plt
digits = load_digits() ## 导入数据
X = digits.data ## 数据X坐标值
Y = digits.target ##数据Y坐标值
train_sizes, train_loss, test_loss = learning_curve(SVC(gamma=0.001), X, Y, cv=10,
train_sizes=[0.1, 0.25, 0.5, 0.75, 1]) ## 对SVC(gamma=0.001)进行训练,并标记下10%, 25%, 50%, 75%, 100%作为训练集时的精确度
train_loss_mean = np.mean(train_loss, axis=1) ## 训练集准确度
test_loss_mean = np.mean(test_loss, axis=1) ## 测试集准确度
## 将训练准确度与测试准确度画出来,看到模型不断训练,准确度不断提升
plt.plot(train_sizes, train_loss_mean, 'o-', color="r", label="Training")
plt.plot(train_sizes, test_loss_mean, 'o-', color="g", label="Cross-validation")
plt.show()
不断训练准确度不断提升learning_curve
validation_curve 遍历可能的参数值,找到最合适的参数值
import numpy as np
from sklearn.model_selection import learning_curve, validation_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
from matplotlib import pyplot as plt
digits = load_digits()
X = digits.data
Y = digits.target
param_range = np.logspace(-6, -2.3, 5)
train_loss, test_loss = validation_curve(SVC(), X, Y, param_name='gamma', param_range=param_range, cv=10)
## train_sizes为10%, 25%等记录一下
train_loss_mean = np.mean(train_loss, axis=1)
test_loss_mean = np.mean(test_loss, axis=1)
plt.plot(param_range, train_loss_mean, 'o-', color="r", label="Training")
plt.plot(param_range, test_loss_mean, 'o-', color="g", label="Cross-validation")
plt.xlabel("gamma")
plt.ylabel("value")
plt.show()
参数validation_curve
从图中可以看到,gamma使用0.0005值左右的数据准确度会更适合,也不会出现过度训练的问题。
保存训练后的模型
- 使用pickle模块保存对象
将模型保存到save/clf.pickle文件中
from sklearn import svm
from sklearn import datasets
clf = svm.SVC()
iris = datasets.load_iris()
X, Y = iris.data, iris.target
clf.fit(X, Y) ## 训练模型
import pickle
with open('save/clf.pickle', 'wb') as clf_file:
pickle.dump(clf, clf_file) ## 将模型保存到save/clf.pickle文件中
将模型从save/clf.pickle文件中导入,并进行预测
from sklearn import svm
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
with open('save/clf.pickle', 'rb') as clf_file:
clf = pickle.load(clf_file)
print(clf.predict(X[0:1]))
- 使用joblib
将模型保存到save/clf.pkl
from sklearn import svm
from sklearn import datasets
from sklearn.externals import joblib
clf = svm.SVC()
iris = datasets.load_iris()
X, Y = iris.data, iris.target
clf.fit(X, Y)
## 保存数据
joblib.dump(clf, 'save/clf.pkl')
将模型从save/clf.pkl文件中导入,并进行预测
from sklearn import svm
from sklearn import datasets
from sklearn.externals import joblib
iris = datasets.load_iris()
X = iris.data
## 导入对象
clf = joblib.load('save/clf.pkl')
print(clf.predict(X[0:1])) ## 对数据进行预测
参考教程:
- 莫烦教学 SKLearn
网友评论