机器学习介绍与定义
机器学习定义
- 机器学习(Machine Learning)本质上就是让计算机自己在数据中学习规律,并根据所得到的规律对未来数据进行预测。
- 机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习(Deep Learning)等算法。
- 机器学习的基本思路是模仿人类学习行为的过程,如我们在现实中的新问题一般是通过经验归纳,总结规律,从而预测未来的过程。机器学习的基本过程如下:
机器学习的发展历史
从机器学习发展的过程上来说,其发展的时间轴如下所示:
机器学习分类
机器学习经过几十年的发展,衍生出了很多种分类方法,这里按学习模式的不同,可分为监督学习、半监督学习、无监督学习和强化学习。
监督学习
- 监督学习(Supervised Learning)是从有标签的训练数据中学习模型,然后对某个给定的新数据利用模型预测它的标签。如果分类标签精确度越高,则学习模型准确度越高,预测结果越精确。
- 监督学习主要用于回归和分类。
- 常见的监督学习的回归算法有线性回归、回归树、K邻近、Adaboost、神经网络等。
- 常见的监督学习的分类算法有朴素贝叶斯、决策树、SVM、逻辑回归、K邻近、Adaboost、神经网络等。
半监督学习
- 半监督学习(Semi-Supervised Learning)是利用少量标注数据和大量无标注数据进行学习的模式。
- 半监督学习侧重于在有监督的分类算法中加入无标记样本来实现半监督分类。
- 常见的半监督学习算法有Pseudo-Label、Π-Model、Temporal Ensembling、Mean Teacher、VAT、UDA、MixMatch、ReMixMatch、FixMatch等。
无监督学习
- 无监督学习(Unsupervised Learning)是从未标注数据中寻找隐含结构的过程。
- 无监督学习主要用于关联分析、聚类和降维。
- 常见的无监督学习算法有稀疏自编码(Sparse Auto-Encoder)、主成分分析(Principal Component Analysis, PCA)、K-Means算法(K均值算法)、DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise)、最大期望算法(Expectation-Maximization algorithm, EM)等。
强化学习
- 强化学习(Reinforcement Learning)类似于监督学习,但未使用样本数据进行训练,是是通过不断试错进行学习的模式。
- 在强化学习中,有两个可以进行交互的对象:智能体(Agnet)和环境(Environment),还有四个核心要素:策略(Policy)、回报函数(收益信号,Reward Function)、价值函数(Value Function)和环境模型(Environment Model),其中环境模型是可选的。
- 强化学习常用于机器人避障、棋牌类游戏、广告和推荐等应用场景中。
机器学习的应用场合
机器学习的应用场景非常广泛,几乎涵盖了各个行业和领域。以下是一些常见的机器学习应用场景的示例:
- 自然语言处理(NLP)
- 医疗诊断与影像分析
- 金融风险管理
- 预测与推荐系统
- 制造业和物联网
- 能源管理与环境保护
- 决策支持与智能分析
- 图像识别与计算机视觉
机器学习项目开发步骤
有5个基本步骤用于执行机器学习任务:
- 收集数据:无论是来自excel,access,文本文件等的原始数据,这一步(收集过去的数据)构成了未来学习的基础。相关数据的种类,密度和数量越多,机器的学习前景就越好。
- 准备数据:任何分析过程都会依赖于使用的数据质量如何。人们需要花时间确定数据质量,然后采取措施解决诸如缺失的数据和异常值的处理等问题。探索性分析可能是一种详细研究数据细微差别的方法,从而使数据的质量迅速提高。
- 练模型:此步骤涉及以模型的形式选择适当的算法和数据表示。清理后的数据分为两部分 - 训练和测试(比例视前提确定); 第一部分(训练数据)用于开发模型。第二部分(测试数据)用作参考依据。
- 评估模型:为了测试准确性,使用数据的第二部分(保持/测试数据)。此步骤根据结果确定算法选择的精度。检查模型准确性的更好测试是查看其在模型构建期间根本未使用的数据的性能。
- 提高性能:此步骤可能涉及选择完全不同的模型或引入更多变量来提高效率。这就是为什么需要花费大量时间进行数据收集和准备的原因。
scikit-learn工具介绍
-
Python语言机器学习工具
-
Scikit-learn包括许多智能的机器学习算法的实现
-
Scikit-learn文档完善,容易上手,丰富的API接口函数
-
Scikit-learn官网:scikit-learn: machine learning in Python — scikit-learn 1.5.2 documentation
-
Scikit-learn中文文档:sklearn
scikit-learn安装
参考以下安装教程:https://www.sklearncn.cn/62/
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn
Scikit-learn包含的内容
数据集
sklearn玩具数据集介绍
数据量小,数据在sklearn库的本地,只要安装了sklearn,不用上网就可以获取(波士顿房价数据现在不能被本地获取)
sklearn现实世界数据集介绍
数据量大,数据只能通过网络获取
sklearn加载玩具数据集
鸢尾花数据
1.鸢尾花数据集介绍
(1)特征有
- 花萼长 sepal length
- 花萼宽sepal width
- 花瓣长 petal length
- 花瓣宽 petal width
(2)三分类(target_names):
- 0-Setosa山鸢尾
- 1-Versicolour变色鸢尾
- 2-Virginica维吉尼亚鸢尾
(3)iris字典中有几个重要属性:
# data 特征
# feature_names 特征描述
# target 目标
# target_names 目标描述
# DESCR 数据集的描述
# filename 下后到本地保存后的文件名
from sklearn.datasets import load_iris
import numpy as np
import pandas as pd
# 鸢尾花数据集是一个字典
# 但它不是一个真正的字典,但你可以像访问字典那样访问它的属性和键
iris = load_iris()# 加载鸢尾花的数据集(去本地加载了一个csv文件)
# iris.feature_names存储在字典的Bunch对象中对于data特征(行数据)的特征描述(列名), 是一个非numpy的列表
pd.DataFrame(iris.data, columns = iris.feature_names).head()
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | |
---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
2 | 4.7 | 3.2 | 1.3 | 0.2 |
3 | 4.6 | 3.1 | 1.5 | 0.2 |
4 | 5.0 | 3.6 | 1.4 | 0.2 |
"""
0-Setosa山鸢尾
1-Versicolor变色鸢尾
2-Virginica维吉尼亚鸢尾
"""
# 数据集中记录的不同的鸢尾花花型,不同的数字代表不同的花型
print(f"目标形状:\n",iris.target)#目标形状,返回值是一个numpy数组
目标形状: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
print(f"目标描述:\n",iris.target_names)#目标描述,对于目标形状对应的值
print(iris.DESCR)#数据集的描述
目标描述: ['setosa' 'versicolor' 'virginica']
iris = load_iris()# 加载鸢尾花的数据集(去本地加载了一个csv文件)
print(iris.filename) # 数据集文件的路径(如果数据集是从文件中加载的,否则可能是None)
iris.csv
下面使用pandas把特征和目标一起显示出来
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
# 加载玩具数据集
iris = load_iris()
# 获取data数据
feature = iris.data
# 获取鸢尾花的目标形状
target = iris.target
#将目标形状转为二维数组
target.shape = (len(target),1)
# 使用 np.hstack 将它们沿水平方向拼接成一个新的数组
data = np.hstack([feature, target])
print(type(data))
# 获取特征描述(列名)
cols = iris.feature_names
# 加入目标形状列
cols.append("target")
#转为dataframe数组,查看前五行数据
pd.DataFrame(data, columns=cols).head()
<class 'numpy.ndarray'>
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | target | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0.0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0.0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0.0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0.0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0.0 |
分析糖尿病数据集(后面的具体数据含义可自行上网查找)
这是回归数据集,有442个样本,有可能就有442个目标值。
from sklearn.datasets import load_diabetes
import pandas as pd
# 不同的数据集中包含的数据略有不同
diabetes = load_diabetes()
print(diabetes.keys())
# print(f"数据集特征data:\n", diabetes.data)
df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names).head()
display(df)
dict_keys(['data', 'target', 'frame', 'DESCR', 'feature_names', 'data_filename', 'target_filename', 'data_module'])
葡萄酒数据集
from sklearn.datasets import load_wine
import pandas as pd
wine_data = load_wine()
print(dict(wine_data).keys())
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])
数字数据集
digits = load_digits()
print(digits.keys())
dict_keys(['data', 'target', 'frame', 'feature_names', 'target_names', 'images', 'DESCR'])
linnerud物理锻炼数据集
from sklearn.datasets import load_linnerud
linnerud = load_linnerud()
print(linnerud.keys())
dict_keys(['data', 'feature_names', 'target', 'target_names', 'frame', 'DESCR', 'data_filename', 'target_filename', 'data_module'])
威斯康星州乳腺癌数据集
from sklearn.datasets import load_breast_cancer
breast = load_breast_cancer()
print(breast.keys())
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
sklearn获取现实世界数据集
(1)所有现实世界数据,通过网络才能下载后,默认保存的目录可以使用下面api获取。实际上就是保存到home目录
from sklearn import datasets
datasets.get_data_home() #查看数据集默认存放的位置
(2)下载时,有可能因为网络问题而出题,要“小心”的解决网络问题,不可言…..
(3)第一次下载会保存的硬盘中,如果第二次下载,因为硬盘中已经保存有了,所以不会再次下载就直接加载成功了。
获取20分类新闻数据
1.使用函数: sklearn.datasets.fetch_20newsgroups(data_home,subset)
2.函数参数说明:
(1)data_home
- None:这是默认值,下载的文件路径为 “C:/Users/ADMIN/scikit_learn_data/20news-bydate_py3.pkz”
- 自定义路径
例如 “./src”, 下载的文件路径为“./20news-bydate_py3.pkz”
(2)subset
- “train”,只下载训练集
- “test”,只下载测试集
- “all”, 下载的数据包含了训练集和测试集
(3)return_X_y,决定着返回值的情况
- False,这是默认值
- True
3.代码
from sklearn.datasets import fetch_20newsgroups #这是一个20分类的数据
news = fetch_20newsgroups(data_home=None,subset='all')
print(len(news.data)) #18846
print(news.target.shape) #(18846,)
print(len(news.target_names)) #20
print(len(news.filenames)) #18846
本地csv数据
创建csv文件
1.方式1:打开计事本,写出如下数据,数据之间使用英文下的逗号, 保存文件后把后缀名改为csv
csv文件可以使用excel打开
, milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
2.方式2:创建excel 文件, 填写数据,以csv为后缀保存文件
pandas加载csv(加载的文件是pandas的数组文件)
1.使用pandas的read_csv(“文件路径”)函数可以加载csv文件,得到的结果为数据的DataFrame形式
pd.read_csv("./src/ss.csv")
数据集的划分
1.相关知识
- 星号传参
def m(*a, **b):
print(a) #('hello', 123)
print(b) #{'name': '小王', 'age': 30, 'sex': '男'}
m("hello", 123, name="小王", age=30, sex="男")
2.列表
list = [11,22,33]
a, b, c = list # a=11 b=22 c=33
a, b = ["小王", 30] #a="小王" b=30
函数
sklearn.model_selection.train_test_split(*arrays,**options)
参数
1. *array
- 这里用于接收1到多个"列表、numpy数组、稀疏矩阵或padas中的DataFrame"。
2.options, 重要的关键字参数有:
- test_size 、train_size值为0.0到1.0的小数,表示划分后测试集占的比例
- random_state 值为任意整数,表示随机种子,使用相同的随机种子对相同的数据集多次划分结果是相同的。否则多半不同
- stratify 值为目标数组,分层的划分对象
3.返回值说明
- 返回值为列表list, 列表长度与形参array接收到的参数数量相关联, 形参array接收到的是什么类型,list中对应被划分出来的两部分就是什么类
数据集划分
列表数据集划分
- 因为随机种子都使用了相同的整数(22),所以划分的情况是相同的。
- 随机方式的相同,便于每次测试的遍历
from sklearn.model_selection import train_test_split
arr1 = [33,43,22,21,32,23,24,25,63,73,82,92,10]
#分割为两部分,二维数据,一部分占80%,另一部分占20%
data = train_test_split(arr1, train_size=0.8)
"""
列表中存储分层后的两个列表
[[33, 23, 21, 32, 63, 22, 82, 73, 24, 92], [25, 10, 43]]
"""
print(data)
x_trian,y_test = train_test_split(arr1, train_size=0.8)
"""
将列表中分层的列表单独取出
[22, 43, 23, 21, 63, 32, 82, 25, 24, 10]
[73, 92, 33]
"""
print(x_trian)
print(y_test)
# 两个数组不按顺序(随机)进行百分比划分,但两个数组的分割后的下标要对齐,
# 比如,arr1的第一个下标的值要与arr2的第一个下标的值的所处位置对应,以此类推。
# 比如33与1的位置一定要对应
arr1 = [33,43,22,21,32,23,24,25,63,73,82,92,10]
arr2 = [1,2,2,2,1,1,1,2,2,3,3,4,5]
x_trian, x_test, y_train, y_test = train_test_split(arr1, arr2, test_size=0.2)
"""
[23, 63, 73, 22, 24, 25, 82, 92, 32, 33] [21, 10, 43]
[1, 2, 3, 2, 1, 2, 3, 4, 1, 1] [2, 5, 2]
"""
print(x_trian, x_test)
print(y_train, y_test)
ndarray数据集划分
# ndarray的数据集划分
from sklearn.model_selection import train_test_split
import numpy as np
x = np.arange(100)
print(x)#这个x数据集中有几个数据集(50个), 每一个数据有两个特征(2)
x_trian, x_test = train_test_split(x, test_size=0.2, random_state=42)
"""
(80,)
(20,)
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
"""
print(x_trian.shape)
#测试集不是元组,是列表中储存的元组
print(x_test.shape)
print(type(x_test))
print(type(x_trian))
二维数组数据集划分
train_test_split只划分第一维度,第二维度保持不变
x= [[1,2,3,111],
[1,23,3,112],
[1,24, 113],
[1,42,34,114],
[1,2,33,115],
[1,2,3,116],
[14,2,3,117],
[14,2,35,118],
[1,42,3,119],
[14,23,34,220],
]
y = [1,1,1,1,1,2,2,2,1,1]
# stratify=y根据进行分层
# shuffle洗牌,打乱,默认为True
# 因为y的2元素太少,取0.8,分割后的y_test中就没有2这类元素了
x_trian, x_test, y_train, y_test=train_test_split(x, y, train_size=0.8, stratify=y)
"""
x_train:
[[14, 2, 35, 118], [1, 42, 3, 119], [1, 2, 3, 111], [14, 2, 3, 117], [1, 24, 113], [14, 23, 34, 220], [1, 2, 3, 116], [1, 42, 34, 114]]
x_test:
[[1, 2, 33, 115], [1, 23, 3, 112]]
y_train:
[1, 1, 1, 2, 1, 1, 2, 1]
y_test:
[1, 1]
"""
print("x_train: \n", x_trian)
print("x_test: \n", x_test)
print("y_train: \n", y_train)
print("y_test: \n", y_test)
- 随机种子:规定随机的算法一致
x= [[1,2,3,111],
[1,23,3,112],
[1,24, 113],
[1,42,34,114],
[1,2,33,115],
[1,2,3,116],
[14,2,3,117],
[14,2,35,118],
[1,42,3,119],
[14,23,34,220],
]
y = [1,1,1,1,1,2,2,2,2,2]
#random_state某种随机算法的随机种子,
# 相同的随机种子,多次运行同个数据,随机方式一样,利于比较
x_trian, x_test, y_train, y_test=train_test_split(x, y, train_size=0.8, stratify=y, random_state=4)
print("x_train: \n", x_trian)
print("x_test: \n", x_test)
print("y_train: \n", y_train)
print("y_test: \n", y_test)
DataFrame数据集划分
可以划分DataFrame, 划分后的两部分还是DataFrame
# dataFrame的数据划分
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
#数据集的划分
data = np.arange(1,100).reshape(33,3)
data = pd.DataFrame(data, columns=['a','b','c'])
# print(data)
# 0.7不为整,进行取整
# train和test的取整不超过原值数量
train, test = train_test_split(data, train_size=0.7, shuffle=True, random_state=4)
"""
随机划分行数据
(23, 3)
(10, 3)
"""
print(train.shape)
print(test.shape)
字典数据集划分
可以划分非稀疏矩阵,用于将字典列表转换为特征向量。这个转换器主要用于处理类别数据和数值数据的混合型数据集
- 对于类别特征
DictVectorizer
会为每个不同的类别创建一个新的二进制特征,如果原始数据中的某个样本具有该类别,则对应的二进制特征值为1,否则为0。 - 对于数值特征保持不变,直接作为特征的一部分,这样,整个数据集就被转换成了一个适合机器学习算法使用的特征向量形式
# 字典的特征提取和数据划分
# 将科学键值转换为科学计数法,不是纯数字的将转化成矩阵,每列表示一个没数字的键值,对应的键值为一,非对应的为0
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
arr = [{"name":"重庆", "count":2000, "tempreture":41},
{"name":"成都", "count":2300, "tempreture":28},
{"name":"广州", "count":4900, "tempreture":20},
{"name":"深圳", "count":1200, "tempreture":35}]
model = DictVectorizer(sparse=False)#sparse=False表示返回一个完整的矩阵,sparse=True表示返回稀疏矩阵
data = model.fit_transform(arr)
"""
# 字典的特征提取和数据划分
# 将科学键值转换为科学计数法,不是纯数字的将转化成矩阵,每列表示一个没数字的键值,对应的键值为一,非对应的为0
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
arr = [{"name":"重庆", "count":2000, "tempreture":41},
{"name":"成都", "count":2300, "tempreture":28},
{"name":"广州", "count":4900, "tempreture":20},
{"name":"深圳", "count":1200, "tempreture":35}]
model = DictVectorizer(sparse=False)#sparse=False表示返回一个完整的矩阵,sparse=True表示返回稀疏矩阵
data = model.fit_transform(arr)
print(data)
x_train, y_train = train_test_split(data, train_size=0.8, random_state=666)
print(x_train)
print(y_train)
"""
print(data)
x_train, y_train = train_test_split(data, train_size=0.8, random_state=666)
"""
[[2.3e+03 0.0e+00 1.0e+00 0.0e+00 0.0e+00 2.8e+01]
[4.9e+03 1.0e+00 0.0e+00 0.0e+00 0.0e+00 2.0e+01]
[2.0e+03 0.0e+00 0.0e+00 0.0e+00 1.0e+00 4.1e+01]]
[[1.2e+03 0.0e+00 0.0e+00 1.0e+00 0.0e+00 3.5e+01]]
"""
print(x_train)
print(y_train)
鸢尾花数据集划分
# 鸢尾花的数据集划分
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
x = iris.data
y = iris.target
# stratify=y分层默认了对y进行分层
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=4, stratify=y)
"""
(120, 4)
(30, 4)
(120,)
(30,)
"""
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)
现实世界数据集划分
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
import numpy as np
news = fetch_20newsgroups(data_home=None, subset='all')
list = train_test_split(news.data, news.target,test_size=0.2, random_state=22)
# """
# 返回值是一个list:其中有4个值,分别为训练集特征、测试集特征、训练集目标、测试集目标
# 与iris相同点在于x_train和x_test是列表,而iris是
# """
x_train, x_test, y_train, y_test = list
#打印结果为: 15076 3770 (15076,) (3770,)
print(len(x_train), len(x_test), y_train.shape, y_test.shape)
特征工程
特征工程概念
1.特征工程:就是对特征进行相关的处理,一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程
2.特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。
3.特征工程步骤为
(1)特征提取, 如果不是像dataframe那样的数据,要进行特征提取,比如字典特征提取,文本特征提取
(2)无量纲化(预处理)
-
归一化
-
标准化
-
降维
-
底方差过滤特征选择
-
主成分分析-PCA降维
-
特征工程API
1.实例化转换器对象,转换器类有很多,都是Transformer的子类, 常用的子类有:
DictVectorizer 字典特征提取
CountVectorizer 文本特征提取
TfidfVectorizer TF-IDF文本特征词的重要程度特征提取
MinMaxScaler 归一化
StandardScaler 标准化
VarianceThreshold 底方差过滤降维
PCA 主成分分析降维
2.转换器对象调用fit_transform()进行转换, 其中fit用于计算数据,transform进行最终转换
fit_transform()可以使用fit()和transform()代替
data_new = transfer.fit_transform(data)
可写成
transfer.fit(data)
data_new = transfer.transform(data)
DictVectorizer 字典列表特征提取
稀疏矩阵
1.稀疏矩阵是指一个矩阵中大部分元素为零,只有少数元素是非零的矩阵。在数学和计算机科学中,当一个矩阵的非零元素数量远小于总的元素数量,且非零元素分布没有明显的规律时,这样的矩阵就被认为是稀疏矩阵。例如,在一个1000 x 1000的矩阵中,如果只有1000个非零元素,那么这个矩阵就是稀疏的。
2.由于稀疏矩阵中零元素非常多,存储和处理稀疏矩阵时,通常会采用特殊的存储格式,以节省内存空间并提高计算效率。
3.三元组表 (Coordinate List, COO):三元组表就是一种稀疏矩阵类型数据,存储非零元素的行索引、列索引和值:
(行,列) 数据
(0,0) 10
(0,1) 20
(2,0) 90
(2,20) 8
(8,0) 70
表示除了列出的有值, 其余全是0
非稀疏矩阵(稠密矩阵)
1.非稀疏矩阵,或称稠密矩阵,是指矩阵中非零元素的数量与总元素数量相比接近或相等,也就是说矩阵中的大部分元素都是非零的。在这种情况下,矩阵的存储通常采用标准的二维数组形式,因为非零元素密集分布,不需要特殊的压缩或优化存储策略。
- 存储:稀疏矩阵使用特定的存储格式来节省空间,而稠密矩阵使用常规的数组存储所有元素,无论其是否为零。
- 计算:稀疏矩阵在进行计算时可以利用零元素的特性跳过不必要的计算,从而提高效率。而稠密矩阵在计算时需要处理所有元素,包括零元素。
- 应用领域:稀疏矩阵常见于大规模数据分析、图形学、自然语言处理、机器学习等领域,而稠密矩阵在数学计算、线性代数等通用计算领域更为常见。
在实际应用中,选择使用稀疏矩阵还是稠密矩阵取决于具体的问题场景和数据特性。
API
1.创建转换器对象
sklearn.feature_extraction.DictVectorizer(sparse=True)
2.参数
- sparse=True返回类型为csr_matrix的稀疏矩阵
- sparse=False表示返回的是数组,数组可以调用.toarray()方法将稀疏矩阵转换为数组
3.转换器对象:
- 转换器对象调用fit_transform(data)函数,参数data为一维字典数组或一维字典列表,返回转化后的矩阵或数组
- 转换器对象get_feature_names_out()方法获取特征名
提取为稀疏矩阵对应的数组
# 字典列表特征提取
from sklearn.feature_extraction import DictVectorizer
import pandas as pd
# 当字典数字数据不是很大时,转换时就不会用科学计数法来显示,反之
data = [{"name":"重庆", "money":38, "age":41},
{"name":"成都", "money":60, "age":28},
{"name":"广州", "money":30, "age":20},
{"name":"深圳", "money":40, "age":35}]
# 初始化工具(字典变成向量的工具器)
model = DictVectorizer(sparse=False)# sparse是否转换为三元组形式
data = model.fit_transform(data)
"""
[[41. 38. 0. 0. 0. 1.]
[28. 60. 0. 1. 0. 0.]
[20. 30. 1. 0. 0. 0.]
[35. 40. 0. 0. 1. 0.]]
<class 'numpy.ndarray'>
['age' 'money' 'name=广州' 'name=成都' 'name=深圳' 'name=重庆']
"""
print(data)
print(type(data))
# numpy数组的列标签
# 数组的特征描述
print(model.get_feature_names_out())
# 只要不用print打印,就会渲染Dataframe数组列表
# pd.DataFrame(data, columns=model.get_feature_names_out())
ddata = pd.DataFrame(data, columns=model.get_feature_names_out())
ddata
a |
---|