3、Sklearn datasets
官网:
https://scikit-learn.org/stable/modules/classes.html?highlight=sklearn%20datasets%20datasets#module-sklearn.datasets
Sklearn提供了标准数据(load_xxx)和可以生产的虚拟数据(datasets.make_xxx)
可以使用这些进行练习~
- Boston数据集
#使用线性回归模型
from sklearn import datasets
from sklearn.linear_model import LinearRegression
#导入Boston数据集,定义特征变量X,目标值y
loaded_data = datasets.load_boston()
data_X = loaded_data.data
data_y = loaded_data.target
#定义模型,使用默认参数
model = LinearRegression()
#拟合数据集
model.fit(data_X,data_y)
print(model.predict(data_X[:4,:]))
print(data_y[:4])
- 自己构造虚拟数据进行学习
from sklearn import datasets
import matplotlib.pyplot as plt
X,y = datasets.make_regression(n_samples=100,n_features=1,n_targets=1,noise=1)
plt.figure()
plt.scatter(X,y)
plt.show()
【说明】
datasets.make_regression
https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_regression.html#sklearn.datasets.make_regression
构造的各种参数可以根据自己需要调整
Parameters:
n_samples:样本数,int,可选默认100
n_features:特征数量,int,可选默认100
n_targets:int, 回归目标数量,可选,默认1,与样本相关联的y输出向量的维数。默认情况下,输出是标量。
noise:噪声,float,可选 (default=0.0),用于输出的高斯噪声的标准差
4、Sklearn model的常用属性和功能
model常用属性:
利用上例boston的栗子
#输出X---》data_X.shape:(506,13)
print(model.coef_)
#输出y轴的交点
print(model.intercept_)
#获得模型的参数
print(model.get_params())
#对训练情况进行打分
print(model.score(data_X,data_y))
model 功能:例如fit、predict等
5、nomalization标准化(scale)
Feature Scaling:
idea:Make sure features are on a similar scale.
栗子:
import numpy as np
from sklearn import preprocessing
from sklearn.cross_validation import train_test_split
from sklearn.datasets.samples_generator import make_classification
from sklearn.svm import SVC
import matplotlib.pyplot as plt
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()
X = preprocessing.scale(X)
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))
当不使用preprocessing.scale(X)进行标准化的时候,精确度将下降
6、Cross validation交叉验证
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score#引入交叉验证,数据分为5组进行训练
###引入数据集###
iris=load_iris()
X=iris.data
y=iris.target
###训练数据###
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
#定义模型,选择邻近的5个点
knn=KNeighborsClassifier(n_neighbors=5)
#交叉验证的评分:评分方式为accuracy
scores=cross_val_score(knn,X,y,cv=5,scoring='accuracy')
#每组的评分结果
print(scores)
#平均评分结果
print(scores.mean())
【说明】
cross_val_score():
sklearn.cross_validation.cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’)
返回:交叉验证每次运行的评分数组
estimator:数据对象
X:数据
y:预测数据
soring:调用的方法
cv:交叉验证生成器或可迭代的次数
n_jobs:同时工作的cpu个数(-1代表全部)
verbose:详细程度
fit_params:传递给估计器的拟合方法的参数
pre_dispatch:控制并行执行期间调度的作业数量。减少这个数量对于避免在CPU发送更多作业时CPU内存消耗的扩大是有用的。该参数可以是:
1)没有,在这种情况下,所有的工作立即创建并产生。将其用于轻量级和快速运行的作业,以避免由于按需产生作业而导致延迟
2)一个int,给出所产生的总工作的确切数量
3)一个字符串,给出一个表达式作为n_jobs的函数,如'2 * n_jobs'
调参:
1)scoring='accuracy'
import matplotlib.pyplot as plt
###设置n_neighbors的值为1到30,通过绘图来看训练分数###
k_range=range(1,31)
k_scores=[]
for k in k_range:
knn=KNeighborsClassifier(n_neighbors=k)
scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy')#for classfication
k_scores.append(scores.mean())
plt.plot(k_range,k_scores)
plt.xlabel('Value of k for KNN')
plt.ylabel('CrossValidation accuracy')
plt.show()
我们可以看到n_neighbor在12-18之间评分比较高,实际项目之中我们可以通过这种方式来选择不同参数。
2)scoring='neg_mean_squared_error'
选择误差最小的范围
loss=-cross_val_score(knn,X,y,cv=10,scoring='neg_mean_squared_error')#for regression
k_scores.append(loss.mean())
7、过拟合
import numpy as np
from sklearn.model_selection import learning_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
#引入数据集
digits=load_digits()
X=digits.data
y=digits.target
#学习曲线(learning curve)来判断模型状态:过拟合欠拟合
train_sizes,train_loss,test_loss=learning_curve(
SVC(gamma=0.001),X,y,cv=10,scoring='neg_mean_squared_error',
train_sizes=[0.1,0.25,0.5,0.75,1]
)
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()
【说明】
learning_curve(estimator, X, y, train_sizes=array([ 0.1 , 0.325, 0.55 , 0.775, 1. ]), cv=None, scoring=None, exploit_incremental_learning=False, n_jobs=1, pre_dispatch='all', verbose=0)
学习曲线是不同训练集大小,模型在训练集和验证集上的得分变化曲线。以样本数为横坐标,训练和交叉验证集上的得分(如准确率)为纵坐标。
learning curve可以帮助我们判断模型现在所处的状态:过拟合or 欠拟合
参数:
estimator:所使用的分类器
X:array-like, shape (n_samples, n_features)
训练向量,n_samples是样本的数量,n_features是特征的数量
y:array-like, shape (n_samples) or (n_samples, n_features), optional
目标相对于X分类或者回归
train_sizes:array-like, shape (n_ticks,), dtype float or int
训练样本的相对的或绝对的数字,这些量的样本将会生成learning curve。如果dtype是float,他将会被视为最大数量训练集的一部分(这个由所选择的验证方法所决定)。否则,他将会被视为训练集的绝对尺寸。要注意的是,对于分类而言,样本的大小必须要充分大,达到对于每一个分类都至少包含一个样本的情况。
cv :int, cross-validation generator or an iterable, optional
确定交叉验证的分离策略
--None,使用默认的3-fold cross-validation,
--integer,确定是几折交叉验证
--一个作为交叉验证生成器的对象
--一个被应用于训练/测试分离的迭代器
n_jobs : 整数,可选并行运行的作业数(默认值为1)。windows开多线程需要在"name"==main中运行。
verbose : integer, optional
控制冗余:越高,有越多的信息
返回值:
train_sizes_abs:array, shape = (n_unique_ticks,), dtype int
用于生成learning curve的训练集的样本数。由于重复的输入将会被删除,所以ticks可能会少于n_ticks.
train_scores : array, shape (n_ticks, n_cv_folds)
在训练集上的分数
test_scores : array, shape (n_ticks, n_cv_folds)
在测试集上的分数
调参:gamma=0.1
那么会改变相应的Loss函数。损失函数便在10左右停留,能直观的看出过拟合。
通过修改gamma参数来修正过拟合问题。
from sklearn.model_selection import validation_curve#将learning_curve改为validation_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
#引入数据集
digits=load_digits()
X=digits.data
y=digits.target
#改变param范围来观察Loss函数情况
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,
scoring='neg_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()
如果gamma的值大于0.001便会出现过拟合的问题,那么我们构建模型时gamma参数设置应该小于0.001。
9.保存模型
先将model保存起来,然后可以很方便的将模型迁移。
from sklearn import svm
from sklearn import datasets
#引入数据集,定义模型,训练数据
iris=datasets.load_iris()
X,y=iris.data,iris.target
clf=svm.SVC()
clf.fit(X,y)
#引入sklearn中自带的保存模块
from sklearn.externals import joblib
#保存model
joblib.dump(clf,'sklearn_save/clf.pkl')
#重新加载model,只有保存一次后才能加载model
clf3=joblib.load('sklearn_save/clf.pkl')
print(clf3.predict(X[0:1]))
#存放model能够更快的获得以前的结果