Sklearn学习笔记(二)

3、Sklearn datasets

官网:
https://scikit-learn.org/stable/modules/classes.html?highlight=sklearn%20datasets%20datasets#module-sklearn.datasets

Sklearn提供了标准数据(load_xxx)和可以生产的虚拟数据(datasets.make_xxx)
可以使用这些进行练习~

  1. 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])
image.png
  1. 自己构造虚拟数据进行学习
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()
image.png

【说明】
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))
image.png

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()
image.png
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))

image.png

当不使用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())
image.png

【说明】
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()

image.png

我们可以看到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())
image.png

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()

image.png

【说明】
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左右停留,能直观的看出过拟合。


image.png

通过修改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()
image.png

如果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能够更快的获得以前的结果

你可能感兴趣的:(Sklearn学习笔记(二))