Machine learning—Sklearn
一、简介
SciKit learn的简称是SKlearn,是一个python库,专门用于机器学习的模块。
官网:http://scikit-learn.org/stable/#
参考:https://morvanzhou.github.io/tutorials/machine-learning/sklearn/
GitHub:https://github.com/xiezhiepng/Sklearn
二、安装
pip install scikit-learn==你需要的版本号
三、sklearn知识图谱
由上图可知,算法有四类:分类,回归,聚类,降维。其中分类和回归是监督式学习,即每个数据对应一个 label。 聚类是非监督式学习,即没有 label。 另外一类是 降维,当数据集有很多很多属性的时候,可以通过降维算法把属性归纳起来。
四、KNN classifier(lris花分类)
#导入模块
import numpy as np
from sklearn import datasets
#1.9版本前用from sklearn.cross_validation import train_test_split
#1.9之后使用:
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
#从sklearn。datasets中导入iris花的数据
iris = datasets.load_iris()
iris_X = iris.data
iris_Y = iris.target
print(iris_X[:2,:])#花蕾的半径数据
print(iris_Y)#花的种类
#将iris data分成train和test数据
#split---将数据打乱
#把数据集分为训练集和测试集,其中 test_size=0.3,即测试集占总数据的 30%
X_train,X_test,y_train,y_test = train_test_split(iris_X,iris_Y,test_size=0.3)
# print(y_train)
#knn分类 .fit()分类操作
#定义模块方式 KNeighborsClassifier(), 用 fit 来训练 training data
knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
#使用knn.predict预测X_test,并将预测结果打印出来
print(knn.predict(X_test))#预测值
print(y_test)#真实值
五、datasets
1、example:Linear Regression
#导入datasets包
from sklearn import datasets
from sklearn.linear_model import LinearRegression
#创建数据
#加载数据形式:datasets.load_boston() ,对x,y赋值
loaded_data = datasets.load_boston()
data_X = loaded_data.data
data_Y = loaded_data.target
#用默认值去建立 model
model = LinearRegression()
#train model
model.fit(data_X,data_Y)
#打印预测值
print(model.predict(data_X[:4,:]))#预测前四个数据
print(data_Y[:4])#与真实数据对比
2、创建虚拟数据
import matplotlib.pyplot as plt
#用函数来建立 100 个 sample,有一个 feature,和一个 target。
X,y = datasets.make_regression(n_samples=100,n_features=1,n_targets=1,noise=10)
#用 scatter 的形式来输出结果
plt.scatter(X,y)
plt.show()
六、sklearn常用属性与功能
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()
2、训练和预测
model.fit(data_X,data_Y)
print(model.predict(data_X[:4,:]))#预测前四个数据
3、参数和分数
#model常用的属性和功能
print(model.coef_)#y=0.1x + 0.3#输出模型的斜率
print(model.intercept_)#输出模型的截距(与y轴的交点)
print(model.get_params())#取出之前定义的参数
#model打分,输出精确度
print(model.score(data_X,data_Y))#R^2 coefficient of determination
七、正规化 Normalization
由于资料的偏差与跨度会影响机器学习的成效,因此正规化(标准化)数据可以提升机器学习的成效。
# 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打印出来
print(preprocessing.scale(a))
输出结果
[[ 10. 2.7 3.6]
[-100. 5. -2. ]
[ 120. 20. 40. ]]
[[ 0. -0.85170713 -0.55138018]
[-1.22474487 -0.55187146 -0.852133 ]
[ 1.22474487 1.40357859 1.40351318]]
2、数据标准化与不进行normalized的对比
#(1)加载模块
# 标准化数据模块
from sklearn import preprocessing
import numpy as np
# 将资料分割成train与test的模块
from sklearn.model_selection import train_test_split
# 生成适合做classification资料的模块
from sklearn.datasets.samples_generator import make_classification
# Support Vector Machine中的Support Vector Classifier
from sklearn.svm import SVC
# 可视化数据的模块
import matplotlib.pyplot as plt
(2)生成做classification数据
#生成具有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()
(3)进行数据标准化
X = preprocessing.scale(X) # normalization step
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3)
clf = SVC()
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
#准确率为0.9,不添加准确率只有0.477777777778
八、交叉验证
1、model交叉验证法
from sklearn.cross_validation import cross_val_score # K折交叉验证模块
#使用K折交叉验证模块
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')
#将5次的预测准确率打印出
print(scores)
# [ 0.96666667 1. 0.93333333 0.96666667 1. ]
#将5次的预测准确平均率打印出
print(scores.mean())
# 0.973333333333
2、Learning curve 检视过拟合
#加载对应模块
from sklearn.learning_curve import learning_curve #学习曲线模块
from sklearn.datasets import load_digits #digits数据集
from sklearn.svm import SVC #Support Vector Classifier
import matplotlib.pyplot as plt #可视化模块
import numpy as np
#加载digits数据集,其包含的是手写体的数字,从0到9。数据集总共有1797个样本,每个样本由64个特征组成, 分别为其手写体对应的8×8像素表示,每个特征取值0~16。
digits = load_digits()
X = digits.data
y = digits.target
观察样本由小到大的学习曲线变化, 采用K折交叉验证 cv=10, 选择平均方差检视模型效能 scoring='mean_squared_error', 样本由小到大分成5轮检视学习曲线(10%, 25%, 50%, 75%, 100%):
train_sizes, train_loss, test_loss = learning_curve(
SVC(gamma=0.001), X, y, cv=10, scoring='mean_squared_error',
train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
#平均每一轮所得到的平均方差(共5轮,分别为样本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.xlabel("Training examples")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()
3、Cross-validation
上节我们用到了sklearn.learning_curve当中的另外一种, 叫做validation_curve,用这一种曲线我们就能更加直观看出改变模型中的参数的时候有没有过拟合(overfitting)的问题了. 这也是可以让我们更好的选择参数的方法.使用上一次的例子来验证SVC中的一个参数 gamma 在什么范围内能使 model 产生好的结果. 以及过拟合和 gamma 取值的关系.
from sklearn.learning_curve import validation_curve #validation_curve模块
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
#digits数据集
digits = load_digits()
X = digits.data
y = digits.target
#建立参数测试集
param_range = np.logspace(-6, -2.3, 5)
#使用validation_curve快速找出参数对模型的影响
train_loss, test_loss = validation_curve(
SVC(), X, y, param_name='gamma', param_range=param_range, cv=10, scoring='mean_squared_error')
#平均每一轮的平均方差
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("Loss")
plt.legend(loc="best")
plt.show()
九、save和load
1、使用pickle来保存
#建立与训练一个SVC Model
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)
#pickle保存
import pickle #pickle模块
#保存Model(注:save文件夹要预先建立,否则会报错)
with open('save/clf.pickle', 'wb') as f:
pickle.dump(clf, f)
#读取Model
with open('save/clf.pickle', 'rb') as f:
clf2 = pickle.load(f)
#测试读取后的Model
print(clf2.predict(X[0:1]))
2、使用joblib保存
from sklearn.externals import joblib #jbolib模块
#保存Model(注:save文件夹要预先建立,否则会报错)
joblib.dump(clf, 'save/clf.pkl')
#读取Model
clf3 = joblib.load('save/clf.pkl')
#测试读取后的Model
print(clf3.predict(X[0:1]))