0%

机器学习

1. 概述

1.1 发展

  • 人工智能起点:1956年,达特茅斯会议。

  • 机器学习:1980年代

  • 深度学习:2010年代

1.2 应用场景

预测,图像,NLP等

1.3 机器学习

使用数学工具在数据集学习规律,应用规律解决新问题。

数据集 = 特征值 + 目标值(标签)

分类:

  • 监督学习(有标签)
    • 目标值为类别,离散,分类,k-近邻,贝叶斯决策树和随机森林,逻辑回归
    • 目标值连续,回归,线性回归,岭回归
  • 无监督学习/零样本学习(无标签)
    • 聚类,k-means
  • 强化学习(奖励和惩罚)

1.4 开发流程

  1. 数据获取,拿到数据集
  2. 数据处理
  3. 构建特征,特征工程
  4. 模型训练
  5. 模型评估

2. 数据处理

2.1 开源数据集

  • sklearn
  • kaggle
  • UCI

2.2 sklearn数据集

2.2.1 sklearn数据集获取

  • sklearn.datasets
    • 从该数据集中获取到我们需要的具体的数据集
    • datasets.load_*()
      • 获取小规模的数据集
    • datasets.fetch_*(data_home=None)
      • 获取大规模的数据集,一般即时从网络上下载,data_home表示数据集下载的目录,默认参数为~/scikit_learn_data

2.2.2 小数据集获取

  • sklearn.datasets.load_iris(),鸢尾花数据集
  • sklearn.datasets.load_boston(),波士顿房价

2.2.3 大数据集获取

  • sklearn.datasets.fetch_20newsgroups(data_home=None, subset=’all’)
    • subset,可为train, test, all,表示加载训练集,测试集或全部

2.2.4 数据集返回值

load和fetch均返回的是datasets.base.Bunch(字典)

  • data:数据特征数组,二维数组
  • target:标签数组
  • DESCR:数据描述
  • feature_names:特征名,回归数据集是没有的
  • target_names:标签名

访问:dict[key]=value or dict.ket=value

1
2
3
4
5
6
7
8
9
10
from sklearn.datasets import load_iris

# 数据集获取
iris = load_iris()
print("鸢尾花数据集:\n", iris)
print("描述", iris["DESCR"])
print(iris.data)
print(iris.feature_names)
print(iris.target_names)
print(iris.target)

2.2.5 数据集划分

数据集一般化为训练数据集和测试数据集,一般训练集会更大以获取更好的训练效果

数据集划分的api

  • sklearn.model_selection.train_test_split(arrays, *options)

    • x数据集的特征值
    • y数据集的标签值
    • test_size 测试集的大小,一般为float,20%传0.2
    • random_state随机数种子,不同种子采样的结果不同,相同的种子采样结果相同
    • return 训练集特征值(x_train),测试集特征值(x_test),训练集目标值(y_trian),测试集目标值(y_test)
1
2
3
4
5
6
from sklearn.model_selection import train_test_split

# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=2)
print(x_train, x_train.shape)
print(y_train, y_train.shape)

2.3 特征工程

2.3.1 介绍

  • pandas 用于清洗数据,基本处理
  • sklearn 提供了强大的接口处理特征

2.3.2 特征提取

将数据转化为数字特征,方便计算机更好的理解数据

  • 字典特征提取(特征离散化)
  • 文本特征提取
  • 图像特征提取(深度学习)

API:sklearn.feature_extraction

1. 字典特征提取

对字典数据进行特征值化

对字典中属于类别的数据转化为one-hot编码

  • sklearn.feature_extraction.DictVectorizer(sparse=True,…)
    • DictVectorizer.fit_transform(x) x为字典类型,返回sparse矩阵(稀疏矩阵)
    • DictVectorizer.inverse_transform(x) 上述方法的逆方法,x为数组或sparse矩阵,返回字典类型
    • DictVectorizer.get_feature_names() 返回类别的名称

默认返回的是稀疏矩阵,可以通过sparse = False取消

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from sklearn.feature_extraction import DictVectorizer

def dict_demo():
"""
字典特征提取
:return:
"""

data = [{'city': 'beijing', 'temperature': 20},
{'city': 'shanghai', 'temperature': 23},
{'city': 'shenzhen', 'temperature': 28},
]

# 初始化转换器类
transfer = DictVectorizer(sparse=False)

data_new = transfer.fit_transform(data)
print(data_new)
print(transfer.get_feature_names_out(data))

2. 文本特征提取

方法1:CountVectorizer

对文本数据进行特征化

一般将单词、短语等作为特征基本单位

  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[]):stop_words选取停用词,这些停用词删除,默认英文的停用词(i,the,a,an这些无意义的词),返回词频矩阵
  • CountVectorizer.fit_transform(x):以文本l列表为输入,返回sparse矩阵
  • CountVectorizer.inverse_transform(x):上述方法的逆方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from sklearn.feature_extraction.text import CountVectorizer

def count_demo():
"""
文本特征抽取
:return:
"""
data = ["'build' not found, did you mean"]

transfer = CountVectorizer()

data_new = transfer.fit_transform(data)

print(data_new.toarray())
print(transfer.get_feature_names_out())


[[1 1 1 1 1 1]]
['build' 'did' 'found' 'mean' 'not' 'you']

中文文本特征提取

需要用到结巴分词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_words(text):
"注意有一个空格"
return " ".join(list(jieba.cut(text)))



def count_Chinese_demo():
data = ["画面曝光!乌媒:俄军坦克加装笼形格栅装甲,需更多手段才能摧毁", "没有必要嘲笑这种防护结构", "报道称,社交媒体上出现的这段视频中出现了5辆T-62坦克与1辆BTS-4 装甲抢救车 ,其中BTS-4装甲抢救车与一辆T-62坦克被笼状格栅装甲所覆盖,这种格栅装甲是为防御聚能破甲弹药而设计,对坦克形成了全方位保护"]
cut_data = []

for text in data:
cut_data.append(cut_words(text))
# print(cut_data)

transfer = CountVectorizer()
data_new = transfer.fit_transform(cut_data)

print(data_new.toarray())
print(transfer.get_feature_names_out())
方法2:TfidfVectorizer

关键词:某句话中能够表征该句话特征的关键词

TF-IDF主要思想:某个词或短语在一篇文章中出现概率高,而在其他的文章中出现的概率低,则该词具有很好的类别区分能力,适合用来分类。可以用来评估一个词在一篇文章或者语料库中的重要程度。

  • TF(term frequency):词频
  • IDF(inverse document frequency):逆向文档频率,度量一个词语的普遍重要性,IDF=lg(总文章数/包含该词的文章数)。
  • TF-IDF=TF*IDF

API:

  • sklearn.feature_extraction.text.TfidfVectorizer(stop_word=[], …):返回词的权重矩阵
    • TfidfVectorizer.fit_transform(x):x为文本,返回sparse矩阵
    • TfidfVectorizer.inverse_transform(x):上述的逆方法
    • TfidfVectorizer.get_feature_names():返回标签列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

def cut_words(text):
"注意有一个空格"
return " ".join(list(jieba.cut(text)))



def count_Chinese_demo():
data = ["画面曝光!乌媒:俄军坦克加装笼形格栅装甲,需更多手段才能摧毁", "没有必要嘲笑这种防护结构", "报道称,社交媒体上出现的这段视频中出现了5辆T-62坦克与1辆BTS-4 装甲抢救车 ,其中BTS-4装甲抢救车与一辆T-62坦克被笼状格栅装甲所覆盖,这种格栅装甲是为防御聚能破甲弹药而设计,对坦克形成了全方位保护"]
cut_data = []

for text in data:
cut_data.append(cut_words(text))
# print(cut_data)

transfer = TfidfVectorizer()
data_new = transfer.fit_transform(cut_data)

print(data_new.toarray())
print(transfer.get_feature_names_out())

2.4 特征预处理

通过合适的转化函数将特征数据转化为更适合算法模型的数据

两种无量纲化(消除量纲的影响):

  • 归一化
  • 标准化

2.4.1 归一化

将原始数据映射到(0,1)的范围内

公式:x1 = (x - min) / (max - min), x2 = x1 *(mx - mn)+ mn,mx和mi为指定区间的值,默认mx=1,mi=0

API:

  • sklearn.preprocessing.MinMaxScaler(feature_range=(0,1), …)
    • MinMaxScaler.fit_transform(x):x为numpy array格式的数据[n_samples, n_features],返回同样格式的归一化后的数据

2.4.2 标准化

归一化的最大最小值选取容易受到异常值的影响,因此鲁棒性较差,适用于小数据场景

标准化:将原始数据变换到均值为0,标准差为1的范围内,(x - mean) / std

API:

  • sklearn.preprocessing.StandardScaler():处理后的数据均值为0,标准差为1
    • StandardScaler.fit_transform(x):x为numpy array类型数据,返回标准化后的同样形状的数据

2.5 特征降维

降低特征向量维数,即降低特征个数,得到一组互相”不相关“的主变量的过程

  • 特征选择
  • 主成分分析

2.5.1 特征选择

在包含冗余特征的数据中找出主要特征

方法

  • Filter:过滤式
    • 方差选择法:过滤低方差特征(特征间差距小)
    • 相关系数:过滤相关系数大的特征(特征间相关性强)
  • Embedded:嵌入式
    • 决策树
    • 正则化
    • 深度学习

API

1
sklearn.feature_selection

1. 过滤式

  • 删除低方差特征:将方差较低的那一列特征删除
    • sklearn.feature_selection.VarianceThreshold(threshold = 0.0):threshold默认为0.0,即将方差为0的特征删除,可以自己设定
      • Variance.fit_transform(x):x为特征矩阵,返回删除低方差特征后的特征矩阵
  • 皮尔逊相关系数:反应变量间相关关系的密切程度,相关系数的范围一般为-1到1,r>0,正相关,r<0,负相关,绝对值越接近1,相关性越大。
    • 特征间相关性极高:选取其中一个;加权求和;主成分分析

2.5.2 主成分分析(PCA)

对数据维数进行压缩,尽可能在信息损失比较少的情况下降低维度。

API

  • sklearn.decomposition.PCA(n_components=None):将数据分解到较低维数
    • n_components:
      • 小数:表示保留百分之多少的信息
      • 整数:表示减少到多少特征
    • PCA.fit_transform(x):X为特征矩阵,返回指定维数的特征矩阵
1
2
3
4
5
6
7
8
9
from sklearn.decomposition import PCA

def PCA_demo():
data = [[1, 3, 2, 3], [1, 0, 7, 9], [5, 8, 6, 6]]

transfer = PCA(n_components=0.95)

data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
--------------本文结束感谢您的阅读--------------