人工智能机器学习-特征工程
特征工程
特征工程:就是对特征进行相关的处理
一般使用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()