【人工智能-16】机器学习:概念、工具介绍、数据集、特征工程
上一期【人工智能-15】OpenCV直方图均衡化,模板匹配,霍夫变换,图像亮度变换,形态学变换
下一期【人工智能-17】机器学习:KNN算法、模型选择和调优、朴素贝叶斯分类
文章目录
- 一、概念
- 1.机器学习分类
- 2.如何学习机器学习
- 3.机器学习项目开发步骤
- 二、scikit-learn工具介绍
- 1.安装
- 三、数据集
- 1.sklearn玩具数据集介绍
- 2.sklearn现实世界数据集介绍
- 3.数据集加载
- 示例1:鸢尾花数据
- 示例2:获取20分类新闻数据
- 4.本地数据集
- 5.数据集的划分
- 5.1 列表
- 5.2ndarray数据
- 5.3 Dataframe
- 5.4 二维数组
- 四、特征工程
- 1.概述
- 2.字典列表特征提取
- 3.文本特征提取
- 4.1英文文本提取
- 4.2中文文本提取
- 4.3TF-IDF文本特征词的重要程度特征提取
- 4.4无量纲化-预处理
- 4.4.1MinMaxScaler 归一化
- 4.4.2normalize归一化
- 4.4.3StandardScaler 标准化
- 4.5特征降维
- 4.5.1特征选择
- 1. 低方差过滤特征选择
- 2.根据相关系数的特征选择
- 4.5.2主成份分析(PCA)
一、概念
机器学习简单的说就是让机器去模仿人类的学习过程去学习。具体就是计算机自己去数据中寻找规律,并根据得到的规律对新的数据进行预测。既然要去学习,就要有学习方法:聚类、分类、决策树、贝叶斯、神经网络、深度学习(Deep Learning)等算法。
基本过程如下:
- 需要训练的数据->特征值提取->通过算法进行学习->进行分类 (训练完成,保存模型)
- 需要预测的数据->特征值提取->通过保存的模型进行预测->输出结果
1.机器学习分类
这里按照学习模式的不同分为监督学习、半监督学习、无监督学习和强化学习。
监督学习
在训练时给的数据都是带有答案的,训练完得到模型后通过测试数据进行测试,看得到的结果和本就有的结果对比,通过就合格。这就是监督学习,一般用于回归和分类。
常见的监督学习的回归算法有线性回归、回归树、K邻近、Adaboost、神经网络等。
常见的监督学习的分类算法有朴素贝叶斯、决策树、SVM、逻辑回归、K邻近、Adaboost、神经网络等。
半监督学习
这个就是给一部分带答案的和其他没带答案的,之后一样进行测试,通过就合格。
常见的半监督学习算法有Pseudo-Label、Π-Model、Temporal Ensembling、Mean Teacher、VAT、UDA、MixMatch、ReMixMatch、FixMatch等。
无监督学习
只给数据,不给答案,自己发现规律。就像:给你一堆不同颜色形状的积木,让你自己分类整理
常见的无监督学习算法有稀疏自编码(Sparse Auto-Encoder)、主成分分析(Principal Component Analysis, PCA)、K-Means算法(K均值算法)、DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise)、最大期望算法(Expectation-Maximization algorithm, EM)等。
强化学习
这个就像是我们玩游戏,操作不对就有负反馈,操作正确就有正反馈。通过设置奖励和惩罚来引导学习。
在强化学习中,有两个可以进行交互的对象:智能体(Agnet)和环境(Environment),还有四个核心要素:策略(Policy)、回报函数(收益信号,Reward Function)、价值函数(Value Function)和环境模型(Environment Model),其中环境模型是可选的。
强化学习常用于机器人避障、棋牌类游戏、广告和推荐等应用场景中。
2.如何学习机器学习
学习数学基础:了解线性代数、概率论和统计学等数学概念。这些概念在机器学习中非常重要,可以帮助您理解算法和模型背后的原理。
学习编程语言:掌握至少一种常用的编程语言,如Python或R。这些语言在机器学习中广泛使用,具有丰富的机器学习库和工具。
学习机器学习算法:了解常见的机器学习算法,如线性回归、决策树、支持向量机、神经网络等。学习它们的原理、应用和优缺点。
学习机器学习工具和框架:熟悉常用的机器学习工具和框架,如scikit-learn、TensorFlow、PyTorch等。掌握它们的使用方法和基本操作。
实践项目:通过实践项目来应用所学的知识。选择一些小型的机器学习项目,从数据收集和预处理到模型训练和评估,逐步提升自己的实践能力。
3.机器学习项目开发步骤
- 收集数据:无论是来自excel,access,文本文件等的原始数据,这一步(收集过去的数据)构成了未来学习的基础。相关数据的种类,密度和数量越多,机器的学习前景就越好。
- 准备数据:任何分析过程都会依赖于使用的数据质量如何。人们需要花时间确定数据质量,然后采取措施解决诸如缺失的数据和异常值的处理等问题。探索性分析可能是一种详细研究数据细微差别的方法,从而使数据的质量迅速提高。
- 练模型:此步骤涉及以模型的形式选择适当的算法和数据表示。清理后的数据分为两部分 - 训练和测试(比例视前提确定); 第一部分(训练数据)用于开发模型。第二部分(测试数据)用作参考依据。
- 评估模型:为了测试准确性,使用数据的第二部分(保持/测试数据)。此步骤根据结果确定算法选择的精度。检查模型准确性的更好测试是查看其在模型构建期间根本未使用的数据的性能。
- 提高性能:此步骤可能涉及选择完全不同的模型或引入更多变量来提高效率。这就是为什么需要花费大量时间进行数据收集和准备的原因。
二、scikit-learn工具介绍
- 这是一个python语言机器学习工具
- 机器学习是一种思想,并不是指的此工具,此工具只是将有关机器学习的算法和操作封装起来。
1.安装
考虑到官网在国外,可能下载缓慢,这里使用清华源镜像
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn
三、数据集
1.sklearn玩具数据集介绍
数据量小,数据在sklearn库的本地,只要安装了sklearn,不用上网就可以获取
2.sklearn现实世界数据集介绍
数据量大,数据只能通过网络获取
3.数据集加载
示例1:鸢尾花数据
from sklearn.datasets import load_iris
iris = load_iris()#鸢尾花数据
鸢尾花数据集介绍
特征有:
花萼长 sepal length
花萼宽sepal width
花瓣长 petal length
花瓣宽 petal width
三分类:
0-Setosa山鸢尾
1-versicolor变色鸢尾
2-Virginica维吉尼亚鸢尾
from sklearn.datasets import load_iris
iris = load_iris() #返回一个Bunch对象
iris字典中有几个重要属性:
# data 特征
# feature_names 特征描述
# target 目标
# target_names 目标描述
# DESCR 数据集的描述
# filename 下后到本地保存后的文件名
print(iris.data)#得到特征
print(iris.feature_names) #特征描述
print(iris.target) #目标形状
print(iris.target_names)#目标描述
print(iris.filename) #iris.csv 保存后的文件名
print(iris.DESCR)#数据集的描述
示例2:获取20分类新闻数据
(1)所有现实世界数据,通过网络才能下载后,默认保存的目录可以使用下面api获取。实际上就是保存到home目录
from sklearn import datasets
datasets.get_data_home() #查看数据集默认存放的位置
(2)下载时,有可能回为网络问题而出问题,要使用科学上网。
(3)第一次下载会保存的硬盘中,如果第二次下载,因为硬盘中已经保存有了,所以不会再次下载就直接加载成功了。
(1)使用函数: sklearn.datasets.fetch_20newsgroups(data_home,subset)
(2)函数参数说明:
(2.1) data_home
None这是默认值,下载的文件路径为 “C:/Users/ADMIN/scikit_learn_data/20news-bydate_py3.pkz”
自定义路径例如 “./src”, 下载的文件路径为“./20news-bydate_py3.pkz”
(2.2) subset
“train”,只下载训练集
“test”,只下载测试集
“all”, 下载的数据包含了训练集和测试集
(2.3) return_X_y,决定着返回值的情况
False,这是默认值
True,
(3) 函数返值说明:
当参数return_X_y值为False时, 函数返回Bunch对象,Bunch对象中有以下属性*data:特征数据集, 长度为18846的列表list, 每一个元素就是一篇新闻内容, 共有18846篇*target:目标数据集,长度为18846的数组ndarray, 第一个元素是一个整数,整数值为[0,20)*target_names:目标描述,长度为20的list*filenames:长度为18846的ndarray, 元素为字符串,代表新闻的数据位置的路径当参数return_X_y值为True时,函数返回值为元组,元组长度为2, 第一个元素值为特征数据集,第二个元素值为目标数据集
代码
from sklearn.datasets import fetch_20newsgroups
from sklearn import datasets
# 获取数据集的存储路径
# download_file_path = datasets.get_data_home()
# print(download_file_path)
# 获取数据集(20个类别的新闻)
news_data = fetch_20newsgroups(data_home='./src',subset='all')
print(news_data.data[0])
4.本地数据集
csv文件,形如Excel文件(表格)不过列与列之间使用,
隔开。
使用pandas的read_csv(“文件路径”)函数可以加载csv文件,得到的结果为数据的DataFrame形式
pd.read_csv("./src/ss.csv")
5.数据集的划分
数据集划分是为了更方便的对数据进行处理
from sklearn.model_selection import train_test_splitsklearn.model_selection.train_test_split(*arrays,**options)
参数
(1) *array 这里用于接收1到多个"列表、numpy数组、稀疏矩阵或padas中的DataFrame"。
(2) **options, 重要的关键字参数有:test_size 值为0.0到1.0的小数,表示划分后测试集占的比例random_state 值为任意整数,表示随机种子,使用相同的随机种子对相同的数据集多次划分结果是相同的。否则多半不同strxxxx 分层划分,填y
2 返回值说明返回值为列表list, 列表长度与形参array接收到的参数数量相关联, 形参array接收到的是什么类型,list中对应被划分出来的两部分就是什么类型
5.1 列表
from sklearn.model_selection import train_test_split
data1 = [1, 2, 3, 4, 5]
data2 = ["1a", "2a","3a", "4a", "5a"]
a, b = train_test_split(data1, test_size=0.4, random_state=22)
print(a, b) #[4, 1, 5] [2, 3]
5.2ndarray数据
from sklearn.model_selection import train_test_split
import numpy as np
data1 = [1, 2, 3, 4, 5]
data2 = np.array(["1a", "2a","3a", "4a", "5a"])
a, b, c, d = train_test_split(data1, data2, test_size=0.4, random_state=22)
print(a, b, c, d) #[4, 1, 5] [2, 3] ['4a' '1a' '5a'] ['2a' '3a']# 划分前是什么类型的数据,划分后也一样
5.3 Dataframe
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
data1 = np.arange(1, 16, 1)
data1.shape=(5,3)
data1 = pd.DataFrame(data1, index=[1,2,3,4,5], columns=["one","two","three"])
print(data1)a, b = train_test_split(data1, test_size=0.4, random_state=22)
print("\n", a)
print("\n", b)
5.4 二维数组
from sklearn.model_selection import train_test_split
import numpy as np
data1 = np.arange(1, 16, 1)
data1.shape=(5,3)
print(data1)
a, b = train_test_split(data1, test_size=0.4, random_state=22)
print("a=\n", a)
print("b=\n", b)# 只对第一维度划分,第二维度不变
四、特征工程
1.概述
特征工程:就是对特征进行相关的处理
一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程
特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。
特征工程步骤为:
-
特征提取, 如果不是像dataframe那样的数据,要进行特征提取,比如字典特征提取,文本特征提取
-
无量纲化(预处理)
- 归一化
- 标准化
-
降维
-
底方差过滤特征选择
-
主成分分析-PCA降维
-
2.字典列表特征提取
稀疏矩阵
稀疏矩阵是指一个矩阵中大部分元素为零,只有少数元素是非零的矩阵。在数学和计算机科学中,当一个矩阵的非零元素数量远小于总的元素数量,且非零元素分布没有明显的规律时,这样的矩阵就被认为是稀疏矩阵。例如,在一个1000 x 1000的矩阵中,如果只有1000个非零元素,那么这个矩阵就是稀疏的。
由于稀疏矩阵中零元素非常多,存储和处理稀疏矩阵时,通常会采用特殊的存储格式,以节省内存空间并提高计算效率。
三元组表 (Coordinate List, COO):三元组表就是一种稀疏矩阵类型数据,存储非零元素的行索引、列索引和值:
(行,列) 数据
(0,0) 10
(0,1) 20
(2,0) 90
(2,20) 8
(8,0) 70
表示除了列出的有值, 其余全是0
非稀疏矩阵(稠密矩阵)
非稀疏矩阵,或称稠密矩阵,是指矩阵中非零元素的数量与总元素数量相比接近或相等,也就是说矩阵中的大部分元素都是非零的。在这种情况下,矩阵的存储通常采用标准的二维数组形式,因为非零元素密集分布,不需要特殊的压缩或优化存储策略。
- 存储:稀疏矩阵使用特定的存储格式来节省空间,而稠密矩阵使用常规的数组存储所有元素,无论其是否为零。
- 计算:稀疏矩阵在进行计算时可以利用零元素的特性跳过不必要的计算,从而提高效率。而稠密矩阵在计算时需要处理所有元素,包括零元素。
- 应用领域:稀疏矩阵常见于大规模数据分析、图形学、自然语言处理、机器学习等领域,而稠密矩阵在数学计算、线性代数等通用计算领域更为常见。
在实际应用中,选择使用稀疏矩阵还是稠密矩阵取决于具体的问题场景和数据特性。
- 创建转换器对象:
sklearn.feature_extraction.DictVectorizer(sparse=True)
参数:
sparse=True返回类型为csr_matrix的稀疏矩阵
sparse=False表示返回的是数组,数组可以调用.toarray()方法将稀疏矩阵转换为数组- 转换器对象:
转换器对象调用fit_transform(data)函数,参数data为一维字典数组或一维字典列表,返回转化后的矩阵或数组
转换器对象get_feature_names_out()方法获取特征名
from sklearn.feature_extraction import DictVectorizerdata = [{'city': '北京', 'temperature': 100, 'weather': '晴','gdp': 100},{'city': '上海', 'temperature': 80, 'weather': '阴','gdp': 200},{'city': '广州', 'temperature': 70, 'weather': '雨','gdp': 300},{'city': '深圳', 'temperature': 60, 'weather': '雪','gdp': 400},{'city': '杭州', 'temperature': 50, 'weather': '雷','gdp': 500},
]# 需要模型研究x与y的关系之前,必须保证x,y中全是数字
transfer = DictVectorizer(sparse=True)
data = transfer.fit_transform(data)
print(data) # 稀疏数组
print(transfer.get_feature_names_out()) # 转换后的数据的特征名称
print(data.toarray()) # 使用toarray方法转换成数组
3.文本特征提取
API
sklearn.feature_extraction.text.CountVectorizer
构造函数关键字参数stop_words,值为list,表示词的黑名单(不提取的词)
fit_transform函数的返回值为稀疏矩阵
4.1英文文本提取
from sklearn.feature_extraction.text import CountVectorizer
data = ["hello my name is hello world","ai is very good"]
counter = CountVectorizer()
data = counter.fit_transform(data) # 文本的词频转换为矩阵
print(data.toarray())
print(counter.get_feature_names_out())
4.2中文文本提取
中文文本不像英文文本,中文文本文字之间没有空格,所以要先分词,一般使用jieba分词.
使用pip下载jieba
# jieba基础
import jieba
data = "在如今的互联网世界,正能量正成为澎湃时代的大流量"
data = jieba.cut(data)
data = list(data)
print(data) #['在', '如今', '的', '互联网', '世界', ',', '正', '能量', '正', '成为', '澎湃', '时代', '的', '大', '流量']
data = " ".join(data)
print(data) #"在 如今 的 互联网 世界 , 正 能量 正 成为 澎湃 时代 的 大 流量"
import jieba
from sklearn.feature_extraction.text import CountVectorizer
def cut_words(words):return " ".join(jieba.cut(words)) # 使用jieba进行分词,用空格隔开每个词
data = ["教育学会会长期间坚定支持民办教育事业!","热忱关心、扶持民办学校发展","事业做出重大贡献!"]
data = [cut_words(i) for i in data]
transfer = CountVectorizer()
data = transfer.fit_transform(data)
print(data.toarray())
print(transfer.get_feature_names_out())
'''
[[1 1 0 0 0 1 1 0 1 1 1 0 1 0 0][0 0 0 1 1 0 0 1 0 0 0 1 0 1 0][1 0 1 0 0 0 0 0 0 0 0 0 0 0 1]]
['事业' '会长' '做出' '关心' '发展' '坚定' '学会' '扶持' '支持' '教育' '期间' '民办学校' '民办教育' '热忱''重大贡献']
'''
4.3TF-IDF文本特征词的重要程度特征提取
词频 (TF)
词频是指一个词在文档中出现的频率。通常有两种计算方法:
- 原始词频:一个词在文档中出现的次数除以文档中总的词数。
- 平滑后的词频:为了防止高频词主导向量空间,有时会对词频进行平滑处理,例如使用
1 + log(TF)
。 - 在 TfidfVectorizer 中,TF 默认是:直接使用一个词在文档中出现的次数也就是CountVectorizer的结果
逆文档频率 (IDF)
逆文档频率衡量一个词的普遍重要性。如果一个词在许多文档中都出现,那么它的重要性就会降低。
IDF 的计算公式是:
IDF(t)=log(总文档数包含词t的文档数+1)IDF(t)=\log(\dfrac{总文档数}{包含词t的文档数+1})IDF(t)=log(包含词t的文档数+1总文档数)
在 TfidfVectorizer 中,IDF 的默认计算公式是:
IDF(t)=log(总文档数+1包含词t的文档数+1)+1IDF(t)=\log(\dfrac{总文档数+1}{包含词t的文档数+1})+1IDF(t)=log(包含词t的文档数+1总文档数+1)+1
sklearn.feature_extraction.text.TfidfVectorizer()
构造函数关键字参数stop_words,表示词特征黑名单
fit_transform
函数的返回值为稀疏矩阵
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
def cut_words(words):return " ".join(jieba.cut(words))
data = ["事业教育学会会长期间坚定支持民办教育事业!", "热忱关心、扶持民办学校发展", "事业做出重大贡献!"]
data = [cut_words(i) for i in data]
transfer = TfidfVectorizer()
data = transfer.fit_transform(data) # 训练并转换
print(data.toarray())
print(transfer.get_feature_names_out())
自己实现TF-IDF
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import normalize
import numpy as np
def myTidfVectorizer(data):# 提取词频transfer = CountVectorizer()data = transfer.fit_transform(data)TF = data.toarray()# TF = np.log(TF/ TF.sum(axis=1, keepdims=True))+1# 提取IDFIDF = np.log((len(TF)+1)/(np.sum(TF!=0, axis=0)+1))+1tf_idf = TF * IDF# 归一化tf_idf = normalize(tf_idf, norm="l2")return tf_idf
def cut_words(words):return " ".join(jieba.cut(words))
data = ["事业教育学会会长期间坚定支持民办教育事业!", "热忱关心、扶持民办学校发展", "事业做出重大贡献!"]
data = [cut_words(i) for i in data]
data = myTidfVectorizer(data)
print(data)
'''
[[0.49840822 0.32767345 0. 0. 0. 0.327673450.32767345 0. 0.32767345 0.32767345 0.32767345 0.0.32767345 0. 0. ][0. 0. 0. 0.4472136 0.4472136 0.0. 0.4472136 0. 0. 0. 0.44721360. 0.4472136 0. ][0.4736296 0. 0.62276601 0. 0. 0.0. 0. 0. 0. 0. 0.0. 0. 0.62276601]]
'''
4.4无量纲化-预处理
无量纲,即没有单位的数据
无量纲化包括"归一化"和"标准化"
4.4.1MinMaxScaler 归一化
𝑥scaled=(𝑥-𝑥min)/(𝑥max-𝑥min)
这里的 𝑥min 和 𝑥max 分别是每种特征中的最小值和最大值,而 𝑥是当前特征值,𝑥scaled 是归一化后的特征值。
API
sklearn.preprocessing.MinMaxScaler(feature_range)
参数:feature_range=(0,1) 归一化后的值域,可以自己设定
fit_transform函数归一化的原始数据类型可以是list、DataFrame和ndarray, 不可以是稀疏矩阵
fit_transform函数的返回值为ndarray
# 无量纲化-预处理
# 最大值-最小值
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
transfer = MinMaxScaler(feature_range=(0,1))
data1 = pd.DataFrame([[1, -1, 2], [2, 4, 1], [3, 1, 2], [4, 2, 0]])
data1 = transfer.fit_transform(data1)
print(data1)print('=' * 20)data2 = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
data2 = transfer.fit_transform(data2)
print(data2)
'''
[[0. 0. 1. ][0.33333333 1. 0.5 ][0.66666667 0.4 1. ][1. 0.6 0. ]]
====================
[[0. 0. ][0.25 0.25][0.5 0.5 ][1. 1. ]]
'''
最大值和最小值容易受到异常点影响,所以鲁棒性较差。所以常使用标准化的无量钢化
4.4.2normalize归一化
from sklearn.preprocessing import normalize
normalize(data, norm='l2', axis=1)
#data是要归一化的数据
#norm是使用那种归一化:"l1" "l2" "max
#绝对值相加作为分母,特征值作为分子(l1)
#平方相加作为分母,特征值作为分子(l2)
#max作为分母,特征值作为分子(max)
#axis=0是列 axis=1是行
# normalize
from sklearn.preprocessing import normalize
#data是要归一化的数据
#norm是使用那种归一化:"l1" "l2" "max
#axis=0是列 axis=1是行
data = [[4, 1, 2, 2], [1, 3, 9, 3], [5, 7, 5, 5], [9, 9, 1, 8]]
transfer = normalize(data,norm='l2',axis=1)
print('平方相加作为分母,特征值为分子:\n',transfer)
transfer = normalize(data,norm='l1',axis=1)
print('绝对值相加作为分母,特征值为分子:\n',transfer)
transfer = normalize(data,norm='max',axis=1)
print('特征值为最大值:\n',transfer)
'''
平方相加作为分母,特征值为分子:[[0.8 0.2 0.4 0.4 ][0.1 0.3 0.9 0.3 ][0.44901326 0.62861856 0.44901326 0.44901326][0.59735098 0.59735098 0.06637233 0.53097865]]
绝对值相加作为分母,特征值为分子:[[0.44444444 0.11111111 0.22222222 0.22222222][0.0625 0.1875 0.5625 0.1875 ][0.22727273 0.31818182 0.22727273 0.22727273][0.33333333 0.33333333 0.03703704 0.2962963 ]]
特征值为最大值:[[1. 0.25 0.5 0.5 ][0.11111111 0.33333333 1. 0.33333333][0.71428571 1. 0.71428571 0.71428571][1. 1. 0.11111111 0.88888889]]
'''
4.4.3StandardScaler 标准化
在机器学习中,标准化是一种数据预处理技术,也称为数据归一化或特征缩放。它的目的是将不同特征的数值范围缩放到统一的标准范围,以便更好地适应一些机器学习算法,特别是那些对输入数据的尺度敏感的算法。
最常见的标准化方法是Z-score标准化,也称为零均值标准化。它通过对每个特征的值减去其均值,再除以其标准差,将数据转换为均值为0,标准差为1的分布。
API
sklearn.preprocessing.StandardScale
与MinMaxScaler一样,原始数据类型可以是list、DataFrame和ndarray
fit_transform函数的返回值为ndarray, 归一化后得到的数据类型都是ndarray
from sklearn.preprocessing import StandardScaler
#不能加参数feature_range=(0, 1)
transfer = StandardScaler()
data_new = transfer.fit_transform(data) #data_new的类型为ndarray
示例:
# 标准化 参数可以是list 也可以是numpy.array,dataframe
from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd
data1 = np.array([[1,2],[3,4],[5,6]])
data2 = pd.DataFrame([[0.1,0.5,2],[1,3,0.2],[1,0.3,0.5]])
data3 = [[0.1,0.5,2],[1,3,0.2],[1,0.3,0.5]]
# 此处不能加参数 feature_range,返回值是numpy.array
transfer = StandardScaler()
data1 = transfer.fit_transform(data1)
data2 = transfer.fit_transform(data2)
data3 = transfer.fit_transform(data3)
print('np数组:\n',data1)
print('dataframe:\n',data2)
print('list:\n',data3)
'''
np数组:[[-1.22474487 -1.22474487][ 0. 0. ][ 1.22474487 1.22474487]]
dataframe:[[-1.41421356 -0.62413416 1.3970014 ][ 0.70710678 1.41108592 -0.88900089][ 0.70710678 -0.78695176 -0.50800051]]
list:[[-1.41421356 -0.62413416 1.3970014 ][ 0.70710678 1.41108592 -0.88900089][ 0.70710678 -0.78695176 -0.50800051]]
'''
4.5特征降维
实际数据中,有时候特征很多,计算量会很大,降维就是去掉一些特征,或者转化多个特征为少量个特征
特征降维其目的:是减少数据集的维度,同时尽可能保留数据的重要信息。
特征降维的好处:
减少计算成本:在高维空间中处理数据可能非常耗时且计算密集。降维可以简化模型,降低训练时间和资源需求。
去除噪声:高维数据可能包含许多无关或冗余特征,这些特征可能引入噪声并导致过拟合。降维可以帮助去除这些不必要的特征。
特征降维的方式:
- 特征选择
- 从原始特征集中挑选出最相关的特征
- 主成份分析(PCA)
- 主成分分析就是把之前的特征通过一系列数学计算,形成新的特征,新的特征数量会小于之前特征数量
4.5.1特征选择
从数据集中挑选出最相关的特征,这里有两种方法
1. 低方差过滤特征选择
-
Filter(过滤式): 主要探究特征本身特点, 特征与特征、特征与目标 值之间关联
-
方差选择法: 低方差特征过滤
如果一个特征的方差很小,说明这个特征的值在样本中几乎相同或变化不大,包含的信息量很少,模型很难通过该特征区分不同的对象,比如区分甜瓜子和咸瓜子还是蒜香瓜子,如果有一个特征是长度,这个特征相差不大可以去掉。
- 计算方差:对于每个特征,计算其在训练集中的方差(每个样本值与均值之差的平方,在求平均)。
- 设定阈值:选择一个方差阈值,任何低于这个阈值的特征都将被视为低方差特征。
- 过滤特征:移除所有方差低于设定阈值的特征
-
创建对象,准备把方差为等于小于2的去掉,threshold的缺省值为2.0
sklearn.feature_selection.VarianceThreshold(threshold=2.0)把x中低方差特征去掉, x的类型可以是DataFrame、ndarray和list
VananceThreshold.fit_transform(x)
fit_transform函数的返回值为ndarray
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
def variance_demo():# 1、获取数据,data是一个DataFrame,可以是读取的csv文件data=pd.DataFrame([[10,1],[11,3],[11,1],[11,5],[11,9],[11,3],[11,2],[11,6]])print("data:\n", data) # 2、实例化一个转换器类transfer = VarianceThreshold(threshold=1)#1阈值# 3、调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n",data_new)return None
variance_demo()
2.根据相关系数的特征选择
相关性分为正相关和负相关,正相关就是当一个变量增加或减少伴随着另一个变量的增加或减少;
负相关就是一个变量减少或增加伴随着另一个变量的增加或减少。
当然,两个变量之间具有相关性并不意味着一个变量一定可以影响到另一个变量,这只是统计上的关联性。
皮尔逊相关系数(Pearson correlation coefficient)是一种度量两个变量之间线性相关性的统计量。它提供了两个变量间关系的方向(正相关或负相关)和强度的信息。皮尔逊相关系数的取值范围是 [−1,1],其中:
- ρ=1\rho=1ρ=1 表示完全正相关,即随着一个变量的增加,另一个变量也线性增加。
- ρ=−1\rho=-1ρ=−1 表示完全负相关,即随着一个变量的增加,另一个变量线性减少。
- ρ=0\rho=0ρ=0 表示两个变量之间不存在线性关系。
相关系数ρ\rhoρ的绝对值为0-1之间,绝对值越大,表示越相关,当两特征完全相关时,两特征的值表示的向量是
在同一条直线上,当两特征的相关系数绝对值很小时,两特征值表示的向量接近在同一条直线上。当相关系值为负数时,表示负相关
计算方法:
-
首先,计算两个变量各自的平均值。然后,对每个变量中的每个数据,减去该变量的平均值,得到各自的差值。
-
接着,将对应的数据点的两个差值相乘,得到一系列乘积,并计算这些乘积的总和。
-
之后,分别计算每个变量所有差值的平方的总和,再将这两个平方和相乘,然后求其平方根,得到一个结果。
-
最后,用前面得到的乘积总和除以这个平方根,得到的结果就是皮尔逊相关系数。
该系数的取值范围在 - 1 到 1 之间,用于衡量两个变量之间线性相关的程度:系数接近 1 表示强正相关,接近 - 1 表示强负相关,接近 0 则表示线性相关性较弱或无线性相关。
|ρ|<0.4为低度相关; 0.4<=|ρ|<0.7为显著相关; 0.7<=|ρ|<1为高度相关
scipy.stats.personr(x, y) 计算两特征之间的相关性
返回对象有两个属性:
statistic皮尔逊相关系数[-1,1]
pvalue零假设(了解),统计上评估两个变量之间的相关性,越小越相关
# 皮尔逊相关系数 开发中一般不使用
from scipy.stats import pearsonr
x = [1,2,3,4]
y = [1,7,9,6]
p = pearsonr(x,y)
print(p.statistic) # 相关性, 负数表示负相关,正数表示正相关
print(p.pvalue) # 相关性,越小越相关
4.5.2主成份分析(PCA)
PCA的核心目标是从原始特征空间中找到一个新的坐标系统,使得数据在新坐标轴上的投影能够最大程度地保留数据的方差,同时减少数据的维度。
x0x_0x0投影到L的大小为x0∗cosαx_0*cos \alphax0∗cosα
y0y_0y0投影到L的大小为y0∗sinαy_0*sin\alphay0∗sinα
使用(x0,y0)(x_0,y_0)(x0,y0)表示一个点, 表明该点有两个特征, 而映射到L上有一个特征就可以表示这个点了。这就达到了降维的功能 。
投影到L上的值就是降维后保留的信息,投影到与L垂直的轴上的值就是丢失的信息。保留信息/原始信息=信息保留的比例
步骤
-
得到矩阵
-
用矩阵P对原始数据进行线性变换,得到新的数据矩阵Z,每一列就是一个主成分
-
根据主成分的方差等,确定最终保留的主成分个数, 方差大的要留下。一个特征的多个样本的值如果都相同,则方差为0, 则说明该特征值不能区别样本,所以该特征没有用。
API
- from sklearn.decomposition import PCA
- PCA(n_components=None)
- 主成分分析
- n_components:
- 实参为小数时:表示降维后保留百分之多少的信息
- 实参为整数时:表示减少到多少特征
# PCA
from sklearn.decomposition import PCA
import numpy as np
data = np.array([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
# pca = PCA(n_components=1)
# 降维后保留80%的信息
pca1 = PCA(n_components=0.8)
data_new = pca1.fit_transform(data)
print(data_new)
# 降维后保留3个特征
pca2 = PCA(n_components=3)
data_new = pca2.fit_transform(data)
print(data_new)