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能够更快的获得以前的结果
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容