当前位置: 首页 > article >正文

人工智能机器学习-特征工程

特征工程

        特征工程:就是对特征进行相关的处理

        一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程

特征提取

稀疏矩阵

就是矩阵内含0量居多的矩阵,且零元素分布没有规律。

可以转换为三元数组

( ,)内为矩阵坐标,后面为数据

列出了有意义的,利于机器学习的数值,其余皆为0。

更利于储存。

稠密矩阵

跟稀疏矩阵相比,含零量较少或相等

具体使用:
导入from sklern.feature_extraction import DictVectorizer

DictVectorizer表示对字典列表的特征提取

在使用fit_transfrom转化前需要将字典数组转化为DictVectrizer对象

转换器对象:

(重要)fif_transfrom()函数

里面的参数为字典或者字典嵌套列表,返回值为转化后的矩阵或者数组

#创建转换器对象
from sklearn.feature_extraction import DictVectorizer
data = [{'city':'成都', 'age':30, 'temperature':200}, {'city':'重庆','age':33, 'temperature':60}, {'city':'北京', 'age':42, 'temperature':80}]
#创建DictVertorizer对象
transfer = DictVectorizer(sparse=False)
data_new = transfer.fit_transform(data)
print(data_new)

CountVectorizer 文本特征提取

英文文本提取

导入方法:

from sklearn.feature_extranction.text import CountVectorizer

此处的文本提取,后面的单词为CoutVectotizer

同理;

先创建CoutVectotizer对象,用于转换的对象。

from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
import pandas as pd
data=["stu is well, stu is great", "You like stu"]
#创建CountVectorizer对象,[stop_word=[]]内的为不提取的值
transfer = CountVectorizer(stop_words=['you','is'])
#进行提取
data_new = transfer.fit_transform(data)
print(data_new)

同样使用fit_transfrom进行转化,得到一个三元数组。

中文文本提取

        中文文本不像英文文本,中文文本文字之间没有空格,所以要先分词,一般使用jieba分词.

下载jieba组件, (不要使用conda)

import jieba
from sklearn.feature_extraction.text import CountVectorizer
arr = list(jieba.cut('我爱别急天安门'))
#cut 使用jieba分词

使用jieba方法封装一个函数

def cut(text):
    return " ".join(list(jieba.cut(text)))
    
data = "在如今的互联网世界,正能量正成为澎湃时代的大流量"
data = cut(data)
print(data)

TfidfVectorizer TF-IDF文本特征词的重要程度特征提取

词频(Term Frequency, TF), 表示一个词在当前篇文章中的重要性

逆文档频率(Inverse Document Frequency, IDF), 反映了词在整个文档集合中的稀有程度

计算公式;

代码与CountVectorizer的示例基本相同,仅仅把CountVectorizer改为TfidfVectorizer即可。

计算词频有两种方法:

1.原始词频,一个词在文档中出现的次数除以文档中总的次数

2.平滑后的词频,为了防止高频词主导向量空间,有时会对词频做平滑处理,例如1+log(TF)

from sklearn.feature_extraction.text import TfidfVectorizer,CountVectorizer
import numpy as np
import pandas as pd
import jieba
def cut(test):
    return ''.join(list(jieba.cut(test)))
data = ["教育学会会长期间,坚定支持民办教育事业!",  "扶持民办,学校发展事业","事业做出重大贡献!"]
data_1 = [cut(i) for i in data]
transfer = TfidfVectorizer(stop_words=['期间','做出'])#初始化一个转换器对象
data_new = transfer.fit_transform(data_1)#将对象转换成
# print(data_1)
print(data_new)
pd.DataFrame(data_new.toarray(), columns=transfer.get_feature_names_out())

上面的公式可以用函数方法表示

  • cut 函数使用 jieba 对输入文本进行分词,并将分词结果转换为字符串。

  • data_1 是经过分词处理后的文本列表。

  • TfidfVectorizer 初始化时指定了停用词 ['期间', '做出'],这些词在特征提取时会被忽略。

  • fit_transform 方法将文本数据转换为 TF-IDF 特征矩阵。

  • data_new.toarray() 将稀疏矩阵转换为密集矩阵(二维数组)。

  • transfer.get_feature_names_out() 获取特征名称列表。

  • pd.DataFrame 将二维数组转换为 DataFrame,列名为特征名称。

以上是特征提取并转换成Dataframe形式的代码流程

无量纲化-预处理

无量纲化(Normalization)是数据预处理中的一个重要步骤,尤其是在处理多维数据时。无量纲化的主要目的是消除不同特征之间的量纲差异,使得每个特征对模型的影响更加均衡。

MinMaxScaler 归一化

导入:

from sklearn.preprocessing import MinMaxScaler

sklern.preprocessing    MinMaxscaler

from sklearn.preprocessing import MinMaxScaler
import numpy as np
data = np.array([
    [10, 200, 50],
    [20, 150, 60],
    [30, 100, 70],
    [40, 50, 80]
])
transfer = MinMaxScaler(feature_range=(0, 1))
data_new = transfer.fit_transform(data)
print(data_new)

feature_range=(), 为阈值,设置阈值可以设置特征取值范围

StandardScaler 标准化

它的目的是将不同特征的数值范围缩放到统一的标准范围,以便更好地适应一些机器学习算法,特别是那些对输入数据的尺度敏感的算法。

与MinMaxScaler一样,原始数据类型可以是list、DataFrame和ndarray

fit_transform函数的返回值为ndarray, 归一化后得到的数据类型都是ndarray

from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd
df_data = pd.read_csv("../src/dating.txt")
# print(df_data)
transfer = StandardScaler()#实例化转换器
data_new = transfer.fit_transform(df_data)#使用fit_transfer方法转化
# print(type(data_new[0:5]))
data_1 = pd.DataFrame(data_new)
nd_data = data_1.values
print(type(nd_data))

fit:

  • 这个方法用来计算数据的统计信息,比如均值和标准差(在StandardScaler的情况下)。这些统计信息随后会被用于数据的标准化。

fit_transform:

  • 这个方法相当于先调用fit再调用transform,但是它在内部执行得更高效。

transform:

  • 这个方法使用已经通过fit方法计算出的统计信息来转换数据。

  • 一旦scaler对象在X_train上被fit,它就已经知道了如何将数据标准化。这时,对于测试集X_test,我们只需要使用transform方法,因为我们不希望在测试集上重新计算任何统计信息,也不希望测试集的信息影响到训练过程。如果我们对X_test也使用fit_transform,测试集的信息就可能会影响到训练过程。

特征降维

特征降维其目的:是减少数据集的维度,同时尽可能保留数据的重要信息。

VarianceThreshold 低方差过滤特征选择

过滤特征:移除所有方差低于设定阈值的特征

from sklearn.feature_selection import VarianceThreshold
import pandas as pd 
def vars():
    data=pd.DataFrame([[10,1],[11,3],[11,1],[11,5],[11,9],[11,3],[11,2],[11,6]])
    transfer = VarianceThreshold(threshold=1)
    data_new = transfer.fit_transform(data)
    print(data_new)
    return
vars()

代码中的threshold=1,为设置的阈值

     低于阈值的被过滤掉。

根据相关系数的特征选择

        正相关性(Positive Correlation)是指两个变量之间的一种统计关系,其中一个变量的增加通常伴随着另一个变量的增加,反之亦然。在正相关的关系中,两个变量的变化趋势是同向的。当我们说两个变量正相关时,意味着:

  • 如果第一个变量增加,第二个变量也有很大的概率会增加。

  • 同样,如果第一个变量减少,第二个变量也很可能会减少。

在数学上,正相关性通常用正值的相关系数来表示,这个值介于0和1之间。当相关系数等于1时,表示两个变量之间存在完美的正相关关系,即一个变量的值可以完全由另一个变量的值预测。

        负相关性(Negative Correlation)与正相关性刚好相反,但是也说明相关,比如运动频率和BMI体重指数程负相关

        不相关指两者的相关性很小,一个变量变化不会引起另外的变量变化,只是没有线性关系. 比如饭量和智商

皮尔逊相关系数
  • $\rho=1$ 表示完全正相关,即随着一个变量的增加,另一个变量也线性增加。

  • $\rho=-1$ 表示完全负相关,即随着一个变量的增加,另一个变量线性减少。

  • $\rho=0$ 表示两个变量之间不存在线性关系。

scipy.stats.personr(x, y) 计算两特征之间的相关性

from scipy.stats import pearsonr
def association_demo():
     # 1、获取数据
    data = pd.read_csv("../src/factor_returns.csv")
    data = data.iloc[:, 1:-2]
     # 计算某两个变量之间的相关系数
    r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
    print(r1.statistic) #-0.0043893227799362555 相关性, 负数表示负相关
    print(r1.pvalue) #0.8327205496590723        正相关性
    r2 = pearsonr(data['revenue'], data['total_expense'])
    print(r2) #PearsonRResult(statistic=0.9958450413136111, pvalue=0.0)
    return None
association_demo()


http://www.kler.cn/a/392603.html

相关文章:

  • Python提取PDF和DOCX中的文本、图片和表格
  • MySQL技巧之跨服务器数据查询:进阶篇-从A数据库复制到B数据库的表中
  • Vue 3 介绍及应用
  • 【Webpack实用指南】如何拆分CSS资源(2)
  • Android OpenGL ES详解——立方体贴图
  • 【Vue】Vue3.0(十九)Vue 3.0 中一种组件间通信方式-自定义事件
  • filezilla连接虚拟机Ubuntu Linux时无法连接到服务器的解决方案
  • HTML之列表学习记录
  • 研发工程师---物联网+AI方向
  • 实测运行容器化Tomcat服务器
  • 数据集整理分类小工具
  • Llama架构及代码详解
  • 平衡二叉树、红黑树、B树、B+树
  • 鸿蒙next版开发:相机开发-会话管理(ArkTS)
  • HTB:Precious[WriteUP]
  • 计算机网络——1.2计算机网络的组成
  • SpringBoot赋能的共享汽车业务管理系统
  • LeetCode【0022】括号生成
  • 腾讯云产品推荐----域名的使用
  • 【时间之外】IT人求职和创业应知【31】
  • 万字长文解读深度学习——ViT、ViLT、DiT
  • 【go从零单排】Text Templates
  • 单体架构VS微服务架构
  • 高阶函数全解析(定义、应用 -- 函数柯理化 反柯理化 发布订阅模式 观察者模式)
  • 执行npm run build -- --report后,生产report.html文件是什么?
  • kafka是如何处理数据乱序问题的?