复盘一篇讲sklearn库的文章(下)
skleran-处理流程
获取数据
以用sklearn的内置数据集, 先导入datasets模块.
最经典的iris数据集作为例子.
from sklearn import datasets
iris = datasets.load_iris() # 导入数据集, json格式
X = iris.data # 获取特征向量
y = iris.target # 获取样本标签
print('特征向量:', X[:3])
print("样本标签:", y[40:60])
特征向量: [[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]]
样本标签: [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]
手写数字数据集 (load_digits)
包含1797个0-9的手写数字数据, 每个数据由8 x 8大小的矩阵构成, 矩阵中值的范围是0-16, 代表颜色的深度.
digits = datasets.load_digits()
print('特征向量shape:', digits.data.shape)
print('目标值shape:', digits.target.shape)
print('图片形状:', digits.images.shape)
特征向量shape: (1797, 64)
目标值shape: (1797,)
图片形状: (1797, 8, 8)
# 显示如下
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
digits = load_digits()
# plt.matshow(digits.images[1]) # 下标索引
# plt.show()
创建数据集
除了用sklearn自带的数据集外, 也可以自己创建训练样本.
参考: https://scikit-learn.org/stable/datasets/
# eg. 用分类问题的样本生成器举例
from sklearn.datasets.samples_generator import make_classification
# n_samples: 样本数
# n_features: 特征数
# n_classes: 几分类
# random_state: 随机种子, 使得随机状态可重复
X, y = make_classification(
n_samples=6,
n_features=5,
n_informative=2,
n_redundant=2,
n_classes=2,
n_clusters_per_class=2,
scale=1.0,
random_state=20
)
# test
for x, y in zip(X, y):
print(y, end=': ')
print(x)
0: [-0.6600737 -0.0558978 0.82286793 1.1003977 -0.93493796]
1: [ 0.4113583 0.06249216 -0.90760075 -1.41296696 2.059838 ]
1: [ 1.52452016 -0.01867812 0.20900899 1.34422289 -1.61299022]
0: [-1.25725859 0.02347952 -0.28764782 -1.32091378 -0.88549315]
0: [-3.28323172 0.03899168 -0.43251277 -2.86249859 -1.10457948]
1: [ 1.68841011 0.06754955 -1.02805579 -0.83132182 0.93286635]
用sklearn.datasets.make_blobs生成聚类测试数据
make_blobs()会根据用户指定的特征数量, 中心点数, 范围等来生成基类数据.
输入:
- n_samples: 样本量(row)
- n_features: 数据的维数(columns)
- centers: 数据中心点(int, 个数) or 坐标值
- cluster_std: 分布的标准差
输出
- X, [n-samples, n_features]形状的样本矩阵
- y, [n_samples]形状的数据, 表示每个点(row)的标签(类别)
from sklearn.datasets import make_blobs
from matplotlib import pyplot as plt
# 生成一个100x2, center=5的样本, 2维是为方便可视化
# cluster_std: 为每个类别设置不同方差
data, lable = make_blobs(n_samples=100, n_features=2, centers=5, cluster_std=[0,1,2,1,3])
# 可视化这100个2维的点
# ndarray: [row, column], 下标从0开始
# plt.scatter(data[:, 0], data[:,1], c=lable)
用sklearn.datasets.make_classification生成分类数据
输入:
- n_features
- n_infomative: 多信息特征个数
- n_redundant: 容易信息
- n_repeated: 重复信息
- n_classes: 分类类别
- n_cluster_per_class: 某一个类别是有几个cluster组成的
用make_gaussian和make_hastie_10_2生成数据
用Hastie算法, 生成二分类数据
# from matplotlib import pyplot as plt
# from sklearn.datasets import make_classification
# from sklearn.datasets import make_gaussian_quantiles # 高斯分布
# from sklearn.datasets import make_blobs, make_hastie_10_2
# plt.figure(figsize=(9,9))
# plt.subplots_adjust(bottom=0.05, top=0.8, left=0.05, right=0.95)
# plt.subplot(111)
# plt.title("One informative feature, one cluster per class", fontsize='small')
# X1, Y1 = make_classification(n_samples=1000,n_features=2, n_redundant=0, n_informative=1,
# n_clusters_per_class=1)
# plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)
# plt.subplot(222)
# plt.title("Two informative features, one cluster per class", fontsize='small')
# X1, Y1 = make_classification(n_samples=1000,n_features=2, n_redundant=0, n_informative=2,
# n_clusters_per_class=1, n_classes=3)
# plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)
# 不画了, 画图其实没多大意思还麻烦
# plt.show()
数据预处理 preprocessing
其实就是为了消除数值数据的量纲, 即通常说的归一化, 标准化等
from sklearn import preprocessing
- StandardScaler -> scale()
- MaxAbsScaler -> maxabs_scale()
- MinMaxScaler -> minmax_sclale()
- RobusSclaler -> robust_scale()
- Normalizer -> normaizer()
sklearn.preprocessing.scale(X)
标准化
\]
即用特征值减去均值, 除以标准差
fit
用来计算训练数据的均值和方差等.
fit_transform
基于fit再进一步来转换训练数据, 从而将数据转换为标准的正态分布
transform
只是对训练数据进行转换.通常是先fit, 再transform
from sklearn import preprocessing
data = [[1,2],[2,1],[1,1],[0,0]]
scaler = preprocessing.StandardScaler()
scaler.fit(data)
scaler.transform(data)
StandardScaler(copy=True, with_mean=True, with_std=True)
array([[ 0. , 1.41421356],
[ 1.41421356, 0. ],
[ 0. , 0. ],
[-1.41421356, -1.41421356]])
最小-最大规范化
对原始数据进行线性变换,变换到[0,1]区间
\]
scaler = preprocessing.MinMaxScaler()
# 对训练数据 fit+transform, 对测试数据只transform
# scaler.fit(train_data)
scaler.transform(train_data)
scaler.transform(test_data)
规范化(normalize)
就是向量的标准化嘛, 先求出样本的p范数, 然后用每个点都的值除以该范数. 即将不同变化范围的值映射到相同的固定范围, 最常见的是[0,1]
X = [
[1,2,3],
[4,5,6],
[7,8,9]
]
preprocessing.normalize(X)
array([[0.26726124, 0.53452248, 0.80178373],
[0.45584231, 0.56980288, 0.68376346],
[0.50257071, 0.57436653, 0.64616234]])
one-hot 编码
是对离散特征值的编码方式, 这个对于文本, 简直太重要了
data = [['a', 'b', 'c'], ['c', 'd', 'f']]
encoder = preprocessing.OneHotEncoder().fit(data)
encoder.transform(data).toarray()
array([[1., 0., 1., 0., 1., 0.],
[0., 1., 0., 1., 0., 1.]])
标签编码
x = ['今晚', '月色', '真美', '真美']
lable = preprocessing.LabelEncoder().fit(x)
lable.transform(x)
array([0, 1, 2, 2], dtype=int64)
数据集拆分
将数据集拆分为4部分: X_train, X_test, y_train, y_test
from sklearn.model_selection import train_test_split
x_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=20)
训练模型(API)
说到调api, 兄嘚, 这是我的强项呀, 工作也是, 工作任务上尽可能不造轮子, 直接调api或C,V. 真的发现自己, 从不生产代码, 只想做代码的搬运工.
咋搬运呢? Python一切皆对象吗,这些封装不就是在一个个的类里面嘛, 即实例化一个类对象, 然后就用方法呀,这对我太熟悉了.
# 0. 特征工程
# 1. 实例化一个模型对象
model = ModelClassName()
# 2. 训练模型
model.fit(X_train, y_train)
# 3. 模型预测
model.predict(X_test)
# 4. 模型评分
model.score(X_test, y_test)
# 5. 查看模型参数
model.get_params()
# 6. 模型优化(超参数, 重写特征工程)
# 7. 反复调参....
# 8. 保存模型
常用模型api
线性回归
from sklearn.linear_model import LinearRegression
model = LinearRegression()
# 参数
# fit_intercept: 是否计算截距, default True
# normalize: 归一化
# n_jobs: 指定线程数
逻辑回归LR
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
# 参数
# penalty: 默认L2正则化
# dual: n_samples > n_features 取False
# C: 该值与正则化强度呈反比
# random_state: 随机数生成器(保留相同采样值次数)
# fit_intercept: 是否需要常量
朴素贝叶斯(Naive Bayes)
from sklearn import naive_bayes
m1 = naive_bayes.MultinomialNB() # 用于文本分类
m2 = naive_bayes.GaussianNB() # 高斯贝叶斯
m3 = naive_bayes.BernoulliNB() # 伯努利概型
# 参数
# alpha: 平滑参数, 不让分母为0, 服从拉普拉斯分布
# fit_prior: 使用学习类的先验概率, false: 使用同一的先验概率
# class_prior: 指定类的先验概率
# binarize: 二值化阀值,若为None, 则假设输入有二进制向量组成
决策树DT
from sklearn import tree
model = tree.DecisionTreeClassifier()
# 参数
# criterion: 算法选择, 如ID3, CART4, 基尼...
# max_depth: 数的最大深度, None-尽量下分
# min_samples_split: 分裂内部节点,所需最小样本数
# .....
支持向量机SVM
from sklearn.svm import SVC
model = SVC(C=1.0, kernel='rbf', gamma='auto')
# C: 误差项惩罚数c
# gamma: 核相关系数
K近邻算法KNN
from sklearn import neighbors
m1 = neighbors.KNeighborsClassifier() # 分类
m2 = neighbors.KNeighborsRegressor() # 回归
# 参数
# n_neighbors: 使用邻居的数目...
多层感知机(神经网络)
from sklearn.neural_network import MLPClassifier
m1 = MLPClassifier(activation='relu', solver='adam')
# 参数
# hidden_layer_sizes: (n,m)元组, n个隐藏单元, m个隐藏层
# activation: 激活函数
# solver: 优化算法(lbfgs, sgd, adam)
# alpha: L2惩罚参数
交叉验证
什么5折交叉验证, 网格搜索的, 这部分, 就是调参的过程, 就不展开了, 总之, 耐心和恒心, 总会获得收获的.
保存模型
保存为pickle文件
import pickle
# 保存模型
with open('model.pickle', 'wb') as f:
pickle.dump(model, f)
# 读取模型
with open('model.pickle', 'rb') as f:
model = pickle.load(f)
# call
model.predict(X_test)
sklean 自带方法 joblib
from sklearn.externals import joblib
# 保存模型
joblib.dump(model, 'model.pickle')
# 载入模型
model = joblib.load('model.picle')
# call
model.predict(X_test)
模型评分
- 模型的score方法: 调用自己模型
print(model.score(X_test, y_test))
- sklearn指标函数, 如常用的classification_report方法
- 支持自定义开发的评价方法
集中交叉验证的方式比较
train_test_split
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore') # 忽略警告信息
# 获取数据
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, test_size=0.30)
# 训练模型
logstic = LogisticRegression().fit(X_train, y_train)
# score
print('score:', round(logstic.score(X_test, y_test),3))
score: 0.947
k-fold cross validation
from sklearn.datasets import load_iris
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.linear_model import LogisticRegression
import warnings
warnings.filterwarnings('ignore')
iris = load_iris()
lg = LogisticRegression()
k_fold = StratifiedKFold(n_splits=3, shuffle=False)
scores = cross_val_score(lg, iris.data, iris.target, cv=k_fold)
print('scores:', scores)
print('mean_scores:', round(scores.mean()))
scores: [0.96078431 0.92156863 0.95833333]
mean_scores: 1.0
复盘一篇讲sklearn库的文章(下)的更多相关文章
- 复盘一篇讲sklearn库学习文章(上)
认识 sklearn 官网地址: https://scikit-learn.gor/stable/ 从2007年发布以来, scikit-learn已成为重要的Python机器学习库, 简称sklea ...
- 复盘一篇浅谈KNN的文章
认识-什么是KNN KNN 即 K-nearest neighbors, 是一个hello world级别, 但被广泛使用的机器学习算法, 中文叫K近邻算法, 是一种基本的分类和回归方法. KNN既可 ...
- ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑫ 域名服务——ESP8266mDNS库
1. 前言 前面的博文中,无论是作为client端还是server端,它们之间的通信都是通过具体的IP地址来寻址.通过IP地址来寻址,本身就是一个弊端,用户怎么会去记住这些魔法数字呢?那么有没 ...
- 前两篇转载别人的精彩文章,自己也总结一下python split的用法吧!
前言:前两篇转载别人的精彩文章,自己也总结一下吧! 最近又开始用起py,是为什么呢? 自己要做一个文本相似度匹配程序,大致思路就是两个文档,一个是试题,一个是材料,我将试题按每题分割出来,再将每题的内 ...
- 一篇关于PHP性能的文章
一篇关于PHP性能的文章 昨晚清理浏览器收藏夹网址时,发现了http://www.phpbench.com/,想起来应该是2015年发现的一个比较性能的文章,我就点进去看了看,发现还是全英文耶,刚好最 ...
- 2.sklearn库中的标准数据集与基本功能
sklearn库中的标准数据集与基本功能 下面我们详细介绍几个有代表性的数据集: 当然同学们也可以用sklearn机器学习函数来挖掘这些数据,看看可不可以捕捉到一些有趣的想象或者是发现: 波士顿房价数 ...
- 1.sklearn库的安装
sklearn库 sklearn是scikit-learn的简称,是一个基于Python的第三方模块.sklearn库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的 ...
随机推荐
- python输出带颜色字体
方法1: (参考https://suixinblog.cn/2019/01/print-colorful.html) 使用Python中自带的print输出带有颜色或者背景的字符串 书写语法 prin ...
- contest2 CF989 div2 ooox? ooox? oooo?
题意 div2C (o) 在\(小于50*50\)的棋盘上放\(A, B, C, D\)四种花, 并给出每种花的连通块数量\(a, b, c, d(\le 100)\), 输出一种摆法 div2D ( ...
- 洛谷p1458顺序的分数题解
抱歉,您们的蒟蒻yxj不知道怎么插入链接qwq就只好粘个文本的了qwq:https://www.luogu.org/problemnew/show/P1458 没错,是个黄题,因为你们的小蒟蒻只会这样 ...
- k均值聚类算法原理和(TensorFlow)实现
顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...
- ECMAScript6-2
1.模板字串.箭头函数 1.1.模板字串 传统js,输出模板 var str='<b>姓名:</b>'+ '<span>lxr</span>'; con ...
- vue+element table的弹窗组件
在处理表格编辑相关的需求,是需要做一个弹框进行保存的:或者查看表格数据的详细信息时,也是需要做弹窗: 当然 ,这是类似于这样的 ,当然 element 已经帮我们做好 弹窗这一块 主要 我想记录的是 ...
- 此页面上的脚本造成Web浏览器运行速度减慢。如果继续运行,您的计算机将可能停止响应。
访问者所使用的浏览器不能完全支持页面里的脚本,形成“脚本错误”.遇到“脚本错误”时一般会弹出一个非常难看的脚本运行错误警告窗口,而事实上,脚本错误并不会影响网站浏览,因此这一警告可谓多此一举.要关闭警 ...
- nginx+keepalived高可用及双主模式【h】
高可用有2中方式. 1.Nginx+keepalived 主从配置 这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候, ...
- Python 绘制 柱状图
用Python 绘制 柱状图,使用的是bar()函数. 一个简单的例子: # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英寸 plt.figure(figsize=(10, 1 ...
- 重置mysql root密码
首先结束mysql进程,利用ps aux | grep mysql命令得到进程ID号,kill ID号,结束进程其次,运行mysqld --skip-grant-tables 或者mysqld_saf ...