1. 数据特征提取

学习了解数据特征的概念,实现用python进行数据特征提取。
以sklearn为例进行学习
我们将城市和环境作为字典数据,来进行特征的提取。

sklearn.feature_extraction.DictVectorizer(sparse = True)

将映射列表转换为Numpy数组或scipy.sparse矩阵

sparse 是否转换为scipy.sparse矩阵表示,默认开启
方法
fit_transform(X,y)

应用并转化映射列表X,y为目标类型

inverse_transform(X[, dict_type])

将Numpy数组或scipy.sparse矩阵转换为映射列表

from sklearn.feature_extraction import DictVectorizer
onehot = DictVectorizer() # 如果结果不用toarray,请开启sparse=False
instances = [{‘city’: ‘北京’,‘temperature’:100},{‘city’: ‘上海’,‘temperature’:60}, {‘city’: ‘深圳’,‘temperature’:30}]
X = onehot.fit_transform(instances).toarray()
print(onehot.inverse_transform(X))
文本特征提取(只限于英文)
文本的特征提取应用于很多方面,比如说文档分类、垃圾邮件分类和新闻分类。那么文本分类是通过词是否存在、以及词的概率(重要性)来表示。

(1)文档的中词的出现

数值为1表示词表中的这个词出现,为0表示未出现

sklearn.feature_extraction.text.CountVectorizer()

将文本文档的集合转换为计数矩阵(scipy.sparse matrices)

方法
fit_transform(raw_documents,y)

学习词汇词典并返回词汇文档矩阵

from sklearn.feature_extraction.text import CountVectorizer
content = [“life is short,i like python”,“life is too long,i dislike python”]
vectorizer = CountVectorizer()
print(vectorizer.fit_transform(content).toarray())
需要toarray()方法转变为numpy的数组形式

温馨提示:每个文档中的词,只是整个语料库中所有词,的很小的一部分,这样造成特征向量的稀疏性(很多值为0)为了解决存储和运算速度的问题,使用Python的scipy.sparse矩阵结构

(2)TF-IDF表示词的重要性

TfidfVectorizer会根据指定的公式将文档中的词转换为概率表示。(朴素贝叶斯介绍详细的用法)

class sklearn.feature_extraction.text.TfidfVectorizer()

方法
fit_transform(raw_documents,y)

学习词汇和idf,返回术语文档矩阵。

from sklearn.feature_extraction.text import TfidfVectorizer
content = [“life is short,i like python”,“life is too long,i dislike python”]
vectorizer = TfidfVectorizer(stop_words=‘english’)
print(vectorizer.fit_transform(content).toarray())
print(vectorizer.vocabulary_)
数据的特征预处理
单个特征
(1)归一化

归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可以运行更快。 例如:一个人的身高和体重两个特征,假如体重50kg,身高175cm,由于两个单位不一样,数值大小不一样。如果比较两个人的体型差距时,那么身高的影响结果会比较大,k-临近算法会有这个距离公式。

min-max方法

常用的方法是通过对原始数据进行线性变换把数据映射到[0,1]之间,变换的函数为:

X^{’}{=}\frac{x-min}{max-min}X

​′
​​
​​ =
​max−min

​x−min
​​

其中min是样本中最小值,max是样本中最大值,注意在数据流场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

min-max自定义处理
这里我们使用相亲约会对象数据在MatchData.txt,这个样本时男士的数据,三个特征,玩游戏所消耗时间的百分比、每年获得的飞行常客里程数、每周消费的冰淇淋公升数。然后有一个 所属类别,被女士评价的三个类别,不喜欢、魅力一般、极具魅力。 首先导入数据进行矩阵转换处理

import numpy as np

def data_matrix(file_name):
“”"
将文本转化为matrix
:param file_name: 文件名
:return: 数据矩阵
“”"
fr = open(file_name)
array_lines = fr.readlines()
number_lines = len(array_lines)
return_mat = zeros((number_lines, 3))

classLabelVector = []

index = 0
for line in array_lines:
line = line.strip()
list_line = line.split(’\t’)
return_mat[index,:] = list_line[0:3]
# if(listFromLine[-1].isdigit()):
# classLabelVector.append(int(listFromLine[-1]))
# else:
# classLabelVector.append(love_dictionary.get(listFromLine[-1]))
# index += 1
return return_mat
输出结果为

[[ 4.09200000e+04 8.32697600e+00 9.53952000e-01]
[ 1.44880000e+04 7.15346900e+00 1.67390400e+00]
[ 2.60520000e+04 1.44187100e+00 8.05124000e-01]
…,
[ 2.65750000e+04 1.06501020e+01 8.66627000e-01]
[ 4.81110000e+04 9.13452800e+00 7.28045000e-01]
[ 4.37570000e+04 7.88260100e+00 1.33244600e+00]]
我们查看数据集会发现,有的数值大到几万,有的才个位数,同样如果计算两个样本之间的距离时,其中一个影响会特别大。也就是说飞行里程数对于结算结果或者说相亲结果影响较大,但是统计的人觉得这三个特征同等重要,所以需要将数据进行这样的处理。

这样每个特征任意的范围将变成[0,1]的区间内的值,或者也可以根据需求处理到[-1,1]之间,我们再定义一个函数,进行这样的转换。

def feature_normal(data_set):
“”"
特征归一化
:param data_set:
:return:
“”"
# 每列最小值
min_vals = data_set.min(0)
# 每列最大值
max_vals = data_set.max(0)
ranges = max_vals - min_vals
norm_data = np.zeros(np.shape(data_set))
# 得出行数
m = data_set.shape[0]
# 矩阵相减
norm_data = data_set - np.tile(min_vals, (m,1))
# 矩阵相除
norm_data = norm_data/np.tile(ranges, (m, 1)))
return norm_data
输出结果为

[[ 0.44832535 0.39805139 0.56233353]
[ 0.15873259 0.34195467 0.98724416]
[ 0.28542943 0.06892523 0.47449629]
…,
[ 0.29115949 0.50910294 0.51079493]
[ 0.52711097 0.43665451 0.4290048 ]
[ 0.47940793 0.3768091 0.78571804]]
这样得出的结果都非常相近,这样的数据可以直接提供测试验证了

min-max的scikit-learn处理
scikit-learn.preprocessing中的类MinMaxScaler,将数据矩阵缩放到[0,1]之间

X_train = np.array([[ 1., -1., 2.],
… [ 2., 0., 0.],
… [ 0., 1., -1.]])

min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
X_train_minmax
array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333],
[ 0. , 1. , 0. ]])
(3)标准化

常用的方法是z-score标准化,经过处理后的数据均值为0,标准差为1,处理方法是:

X^{’}{=}\frac{x-\mu}{\sigma}X

​′
​​
​​ =
​σ

​x−μ
​​

其中\muμ是样本的均值,\sigmaσ是样本的标准差,它们可以通过现有的样本进行估计,在已有的样本足够多的情况下比较稳定,适合嘈杂的数据场景

sklearn中提供了StandardScalar类实现列标准化:

In [2]: import numpy as np

In [3]: X_train = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])

In [4]: from sklearn.preprocessing import StandardScaler

In [5]: std = StandardScaler()

In [6]: X_train_std = std.fit_transform(X_train)

In [7]: X_train_std
Out[7]:
array([[ 0. , -1.22474487, 1.33630621],
[ 1.22474487, 0. , -0.26726124],
[-1.22474487, 1.22474487, -1.06904497]])
(3)缺失值

由于各种原因,许多现实世界的数据集包含缺少的值,通常编码为空白,NaN或其他占位符。然而,这样的数据集与scikit的分类器不兼容,它们假设数组中的所有值都是数字,并且都具有和保持含义。使用不完整数据集的基本策略是丢弃包含缺失值的整个行和/或列。然而,这是以丢失可能是有价值的数据(即使不完整)的代价。更好的策略是估算缺失值,即从已知部分的数据中推断它们。

(1)填充缺失值 使用sklearn.preprocessing中的Imputer类进行数据的填充

class Imputer(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)
“”"
用于完成缺失值的补充

:param param missing_values: integer or "NaN", optional (default="NaN")丢失值的占位符,对于编码为np.nan的缺失值,使用字符串值“NaN”:param strategy: string, optional (default="mean")插补策略如果是“平均值”,则使用沿轴的平均值替换缺失值如果为“中位数”,则使用沿轴的中位数替换缺失值如果“most_frequent”,则使用沿轴最频繁的值替换缺失:param axis: integer, optional (default=0)插补的轴如果axis = 0,则沿列排列如果axis = 1,则沿行排列
"""

import numpy as np
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
Imputer(axis=0, copy=True, missing_values=‘NaN’, strategy=‘mean’, verbose=0)

X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X))
[[ 4. 2. ]
[ 6. 3.666…]
[ 7. 6. ]]
多个特征
降维

PCA(Principal component analysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征标准化,这样才能保证每维度特征的重要性等同。

sklearn.decomposition.PCA

class PCA(sklearn.decomposition.base)
“”"
主成成分分析

:param n_components: int, float, None or string
这个参数可以帮我们指定希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于1的整数。
我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数)

:param whiten: bool, optional (default False)
判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化。对于PCA降维本身来说一般不需要白化,如果你PCA降维后有后续的数据处理动作,可以考虑白化,默认值是False,即不进行白化

:param svd_solver:
选择一个合适的SVD算法来降维,一般来说,使用默认值就够了。
“”"
通过一个例子来看

import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
pca.fit(X)
PCA(copy=True, iterated_power=‘auto’, n_components=2, random_state=None,
svd_solver=‘auto’, tol=0.0, whiten=False)

print(pca.explained_variance_ratio_)
[ 0.99244… 0.00755…]

2.Pytorch构建CNN模型

import torch
torch.manual_seed(0)
torch.backends.cudnn.deterministic = False
torch.backends.cudnn.benchmark = True

import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data.dataset import Dataset

定义模型

class SVHN_Model1(nn.Module):
def init(self):
super(SVHN_Model1, self).init()
# CNN提取特征模块
self.cnn = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2)),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2)),
nn.ReLU(),
nn.MaxPool2d(2),
)
#
self.fc1 = nn.Linear(3237, 11)
self.fc2 = nn.Linear(3237, 11)
self.fc3 = nn.Linear(3237, 11)
self.fc4 = nn.Linear(3237, 11)
self.fc5 = nn.Linear(3237, 11)
self.fc6 = nn.Linear(3237, 11)

def forward(self, img):        feat = self.cnn(img)feat = feat.view(feat.shape[0], -1)c1 = self.fc1(feat)c2 = self.fc2(feat)c3 = self.fc3(feat)c4 = self.fc4(feat)c5 = self.fc5(feat)c6 = self.fc6(feat)return c1, c2, c3, c4, c5, c6

model = SVHN_Model1()

损失函数

criterion = nn.CrossEntropyLoss()

优化器

optimizer = torch.optim.Adam(model.parameters(), 0.005)

loss_plot, c0_plot = [], []

迭代10个Epoch

for epoch in range(10):
for data in train_loader:
c0, c1, c2, c3, c4, c5 = model(data[0])
loss = criterion(c0, data[1][:, 0]) +
criterion(c1, data[1][:, 1]) +
criterion(c2, data[1][:, 2]) +
criterion(c3, data[1][:, 3]) +
criterion(c4, data[1][:, 4]) +
criterion(c5, data[1][:, 5])
loss /= 6
optimizer.zero_grad()
loss.backward()
optimizer.step()

    loss_plot.append(loss.item())c0_plot.append((c0.argmax(1) == data[1][:, 0]).sum().item()*1.0 / c0.shape[0])print(epoch)

class SVHN_Model2(nn.Module):
def init(self):
super(SVHN_Model1, self).init()

    model_conv = models.resnet18(pretrained=True)model_conv.avgpool = nn.AdaptiveAvgPool2d(1)model_conv = nn.Sequential(*list(model_conv.children())[:-1])self.cnn = model_convself.fc1 = nn.Linear(512, 11)self.fc2 = nn.Linear(512, 11)self.fc3 = nn.Linear(512, 11)self.fc4 = nn.Linear(512, 11)self.fc5 = nn.Linear(512, 11)def forward(self, img):        feat = self.cnn(img)# print(feat.shape)feat = feat.view(feat.shape[0], -1)c1 = self.fc1(feat)c2 = self.fc2(feat)c3 = self.fc3(feat)c4 = self.fc4(feat)c5 = self.fc5(feat)return c1, c2, c3, c4, c5使用Pytorch构建构建了一个简易的CNN模型来完成字符分类任务。

零基础入门CV - Task 03 字符识别模型.md相关推荐

  1. Datawhale 零基础入门CV赛事-Task3 字符识别模型

    文章目录 1.CNN实现 2.Pytorch实现CNN 3.使用ImangeNet预训练模型 1.CNN实现 CNN基础 2.Pytorch实现CNN 构建一个简单的CNN模型和训练过程 import ...

  2. 零基础入门CV之街道字符识别----Task1赛题的理解

    Datawhale 零基础入门CV赛事-Task1 赛题理解 本章内容将会对街景字符识别赛题进行赛题背景讲解,对赛题数据的读取进行说明,并给出集中解题思路. 1 赛题理解 赛题名称:零基础入门CV之街 ...

  3. 零基础入门CV之街道字符识别 Task1 赛题理解

    赛题任务 以计算机视觉中字符识别为背景,要求选手预测街道字符编码,这是一个典型的字符识别问题. 赛题数据 数据来源于公开数据集SVHN街道字符. 提供训练集数据3W张照片,验证集数据1W张照片: 每张 ...

  4. 零基础入门CV赛事,理论结合实践

    Datawhale干货 作者:阿水,Datawhale成员 本次分享的背景是,Datawhle联合天池发布的学习赛:零基础入门CV赛事之街景字符识别.本文以该比赛为例,对计算机视觉赛事中,赛事理解和B ...

  5. 零基础入门CV赛事- 街景字符编码识别

    零基础入门CV赛事- 街景字符编码识别 Task01 学习目标 数据介绍 Task01任务内容 数据读取 解题思路 学习目标 熟悉计算机视觉赛事 完成典型的字符识别问题 掌握CV领域赛事的编程和解题思 ...

  6. 零基础入门智能射频——偶极子天线等效电路模型分析

    1.前言 无人机的安全防范和管控,已经成为无人机行业的重点内容.无人机探测解决方案已经变得非常重要.前面系列文章给出了针对无人机侦察和干扰无人机的天线阵设计,上一期文章中,我们给出一种小型化的无人机侦 ...

  7. 零基础入门CV赛事-Task1 赛题理解

    文章目录 赛题介绍 解题思路 1. 定长字符识别 2.不定长字符识别 3. 检测再识别 赛题介绍 赛题以街道字符为为赛题数据(比赛地址),该数据来自收集的SVHN街道字符,训练集数据包括3W张照片,验 ...

  8. Datawhale 零基础入门CV赛事-Task4 模型训练与验证

    文章目录 1.构造验证集 2.模型训练与验证 1.构造验证集 在机器学习模型(特别是深度学习模型)的训练过程中,模型是非常容易过拟合的.深度学习模型在不断的训练过程中训练误差会逐渐降低,但测试误差的走 ...

  9. 阿里云天池竞赛-零基础入门CV赛事-Task4 模型训练与验证

    在上一章节我们构建了一个简单的CNN进行训练,并可视化了训练过程中的误差损失和第一个字符预测准确率,但这些还远远不够.一个成熟合格的深度学习训练流程至少具备以下功能: 在训练集上进行训练,并在验证集上 ...

最新文章

  1. F#创建者Don Syme谈F#设计原则
  2. C#学习知识库2.0版
  3. 隐式反馈的去噪,模型取得巨大提升
  4. 阿里云使用教程(试用一个月)
  5. php url地址 怎么写,php url地址重写
  6. java猜字母讲解_java_猜字母游戏
  7. C语言九十五之实现经典的反转数组(通过指针或数组下标操作)
  8. LeetCode 1283. 使结果不超过阈值的最小除数(二分查找)
  9. atomic原子类实现机制_JDK中Atomic开头的原子类实现原子性的原理是什么?
  10. Cisco NTP配置
  11. win10美化--打造专属我的windows
  12. st7789 旋转_ST7789V彩屏驱动及显示代码
  13. python怎么转换中文_使用Python进行中文繁简转换
  14. java反向查找dns_windows – 反向DNS查找
  15. axure 母版自定义触发事件的工作机制
  16. net stop mysql 服务名无效
  17. 干货 | 播音主持必知的五十个知识
  18. css中2D转换效果实现(4)
  19. 用计算机c语言输出你好,编写第一个C语言程序 - Hello World
  20. 你绝没见过的奢华 全球最贵的13样东西

热门文章

  1. 如何把PDF中A4页面拆分成两张A5来打印
  2. 【ZYNQ开发系列】基于vitis(vivado2019以上版本)的程序固化~如何把程序烧录到QSPI?
  3. 中流-接入Camunda流程引擎
  4. 创办公司流程及注意事项
  5. 使用贝塞尔曲线制作网页手鼓猫
  6. ❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【介绍及安装】❤️❤️源码
  7. MagicalCoder可视化开发平台:轻松搭建业务系统,为企业创造更多价值
  8. Python每日一练-----难题唯唯诺诺,易题重拳出击?(回文数)
  9. 【尚硅谷】Vue.js从入门到精通笔记
  10. java工程师怎么找兼职,快来看鸭~