机器学习基础算法(数据集和特征工程)

    技术2024-07-15  75

    目录

    数据集的组成可用数据集数据集结构 特征工程数据的特征抽取字典的特征抽取DictVectorizer语法流程 对文本进行特征值化tfidf方式提取文本特征TfidfVectorizer语法流程 数据的特征预处理归一化公式语法步骤总结 标准化公式语法步骤总结 缺失值处理缺失值处理方法语法步骤关于np.nan 数据的降维sklearn特征选择:VarianceThreshold语法步骤 sklearn降维:PCA语法步骤

    数据集的组成

    可用数据集

    数据集结构

    常用数据集结构: 特征值+目标值

    特征工程

    特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。

    数据的特征抽取

    特征抽取针对非连续型数据特征抽取对文本等进行特征值化

    字典的特征抽取

    sklearn特征抽取API:

    sklearn.feature_extraction

    字典的特征提取的类:

    sklearn.feature_extraction.DictVectorizer

    DictVectorizer语法

    DictVectorizer.fit_transform(X)

    X:字典或者包含字典的迭代器返回值:返回sparse矩阵

    DictVectorizer.inverse_transform(X)

    X:array数组或者sparse矩阵返回值:转换之前数据格式

    DictVectorizer.get_feature_names()

    返回类别名称

    流程

    实例化类DictVectorizer()调用方法 def dictvec(): """ 字典数据抽取 :return: None """ # 实例化 dict = DictVectorizer(sparse=False) # 调用fit_transform data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}]) print(dict.get_feature_names()) print(dict.inverse_transform(data)) print(data) return None 运行结果为: ['city=上海', 'city=北京', 'city=深圳', 'temperature'] [{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}] [[ 0. 1. 0. 100.] [ 1. 0. 0. 60.] [ 0. 0. 1. 30.]]

    若实例化时默认sparse=True,则data输出为:

    (0, 1) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.0

    对文本进行特征值化

    文本特征值化的类:

    from sklearn.feature_extraction.text import CountVectorizer def countvec(): """ 对文本进行特征值化 :return: None """ cv = CountVectorizer() data = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用 python"]) print(cv.get_feature_names()) print(data.toarray()) return None 运行结果为: ['python', '不用', '人生', '人生漫长', '喜欢', '苦短'] [[1 0 1 0 1 1] [1 1 0 1 0 0]]

    PS:对于长的中文文本,使用jieba库来分割文本。并将分词结果变成字符串当作fit_transform的输入值。

    tfidf方式提取文本特征

    tf-idf的作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度,是分类机器学习算法的重要依据。

    tf:term frequency 统计词出现的次数(频率)idf:inverse document frequency 逆文档频率 log(总文档数量/该词出现的文档数量)tf*idf:重要性

    tf-idf的类:

    sklearn.feature_extraction.text.TfidfVectorizer

    TfidfVectorizer语法

    TfidfVectorizer(stop_words=None,…)

    返回值:词的权重矩阵stop_words:忽略的词

    TfidfVectorizer.fit_transform(X,y)

    X:文本或者包含文本字符串的可迭代对象返回值:返回sparse矩阵

    TfidfVectorizer.inverse_transform(X)

    X:array数组或者sparse矩阵返回值:转换之前数据格式

    TfidfVectorizer.get_feature_names()

    返回值:单词列表

    流程

    def tfidfvec(): """ 中文特征值化 :return: None """ # c1,c2,c3是三个文本分词后得到的列表 c1, c2, c3 = cutword() tf = TfidfVectorizer() data = tf.fit_transform([c1, c2, c3]) print(tf.get_feature_names()) print(data.toarray()) return None

    数据的特征预处理

    特征预处理方法:

    数值型数据: 归一化 标准化 缺失值处理 类别型数据: one-hot编码 时间型数据: 对时间的切分、处理

    归一化

    归一化:通过对原始数据进行变换把数据映射到(默认为[0,1])之间

    公式

    语法

    归一化的类:

    sklearn.preprocessing.MinMaxScaler

    归一化语法:

    MinMaxScalar(feature_range=(0,1)…)

    每个特征缩放到给定范围(默认[0,1])

    MinMaxScalar.fit_transform(X)

    X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的array

    步骤

    def mm(): """ 归一化处理 :return: NOne """ # 实例化 mm = MinMaxScaler(feature_range=(2, 3)) # 利用MinMaxScaler.fit_transform data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]]) print(data) return None

    总结

    最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

    标准化

    标准化:通过对原始数据进行变换把数据变换到均值为0、方差为1范围内。

    公式

    语法

    标准化的类:

    scikit-learn.preprocessing.StandardScaler

    标准化的语法: StandardScaler(…)

    处理之后每列来说所有数据都聚集在均值0附近方差为1

    StandardScaler.fit_transform(X,y)

    X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的array

    StandardScaler.mean_

    原始数据中每列特征的平均值

    StandardScaler.std_

    原始数据每列特征的方差

    步骤

    def stand(): """ 标准化缩放 :return: """ std = StandardScaler() data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]]) print(data) return None

    总结

    如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

    缺失值处理

    缺失值通常使用pandas进行处理,而sklearn中也提供了缺失值处理的API。

    缺失值处理方法

    语法

    sklearn中缺失值处理的API:

    sklearn.preprocessing.Imputer

    Imputer语法

    Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0)

    完成缺失值插补

    Imputer.fit_transform(X,y)

    X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的array

    步骤

    初始化Imputer,指定”缺失值”,指定填补策略,指定行或列(缺失值也可以是别的指定要替换的值)调用fit_transform def im(): """ 缺失值处理 :return:None """ # 实例化 im = Imputer(missing_values='NaN', strategy='mean', axis=0) # 使用fit_transform data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]]) print(data) return None

    关于np.nan

    numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可

    数据的降维

    数据的降维指的是减少特征值的数量,即特征选择。 数据降维的原因:通过特征选择可以减少数据集的冗余和噪声。

    三大方法: Filter 过滤式:VarianceThreshold (特征选择方式还包括神经网络) Embedded 嵌入式:正则化、决策树 Wrapper 包裹式

    sklearn特征选择:VarianceThreshold

    方差特征选择的API为:

    sklearn.feature_selection.VarianceThreshold

    语法

    VarianceThreshold(threshold = 0.0)

    删除所有低方差特征

    Variance.fit_transform(X,y)

    X:numpy array格式的数据[n_samples,n_features]返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。

    步骤

    def var(): """ 特征选择-删除低方差的特征 :return: None """ var = VarianceThreshold(threshold=1.0) data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]) print(data) return None 运行结果为: [[0] [4] [1]]

    sklearn降维:PCA

    PCA:压缩数据维数,尽可能降低原数据的维数(复杂度),损失少量信息。可以削减回归分析或者聚类分析中特征的数量。

    高维度数据容易出现的问题:特征之间通常是线性相关的

    PCA的API为:

    sklearn. decomposition.PCA

    语法

    PCA(n_components=None)

    将数据分解为较低维数空间n_components参数可以输入小数,表示保留多少比例的数据

    PCA.fit_transform(X)

    X:numpy array格式的数据[n_samples,n_features]返回值:转换后指定维度的array

    步骤

    def pca(): """ 主成分分析进行特征降维 :return: None """ pca = PCA(n_components=0.9) data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]]) print(data) return None
    Processed: 0.008, SQL: 9