机器学习基础算法1-特征工程

数据:特征值+目标值。

  1. 特征工程
    将原始数据转化为更好代表预测模型的潜在问题的特征的过程,提高未知数据预测的准确性。

    主要工具
    -1- pandas:处理缺失值,数据转换,一般不需要处理重复值
    -2- sklearn:特征处理


  1. 特征抽取(Feature Extraction)

    对文本等数据进行特征值化

    sklearn特征抽取API:sklearn.feature_extraction

    2.1. 字典数据特征值化(类: sklearn.feature_extraction.DictVectorizer)
    把字典中的类别特征数据,分别转化为数值特征(one-hot编码)。若数据本身为数组形式,应先转换为字典形式。
    one-hot编码:每个类别均生成一个布尔列,取值0或1,避免用多个数字编码造成的类别间存在优先级的歧义。

    from sklearn.feature_extraction import DictVectorizer
    
    onehot = DictVectorizer()  # 如果结果不用toarray,请开启sparse=False
    instances = [{
           'city': '北京','temperature':100},{
           'city': '上海','temperature':60}, {
           'city': '深圳','temperature':30}]
    X = onehot.fit_transform(instances).toarray()
    
    print(onehot.inverse_transform(X))
    

    2.2. 文本特征抽取(类: sklearn.feature_extraction.text.CountVectorizer)
    统计所有文章中所有的词,分别统计这些词在每篇文章出现的次数,单个字母不统计。

    from sklearn.feature_extraction.text import CountVectorizer
    
    content = ["life is short,i like python","life is too long,i dislike python"]
    vectorizer = CountVectorizer()
    print(vectorizer.fit_transform(content).toarray())
    

    每个文档中的词,只是整个语料库中所有词的很小的一部分,这样造成特征向量的稀疏性(很多值为0)为了解决存储和运算速度的问题,使用Python的scipy.sparse矩阵结构。
    对于中文文本,使用前需要进行分词。使用jieba库,jieba.cut()

    2.3. tf-idf分析(类: sklearn.feature_extraction.text.TfidfVectorizer)
    如果某个词在一篇文章中出现概率较高,而在其他文章中较少出现,则认为这个词具有很好的类别区分能力,适于用于文章分类。
    tf:term frequency 词频 --> 词语出现的次数
    idf:inverse document frequency 逆文档频率 --> log(总文档数量/该词出现的文档数量)
    tf * idf:重要性程度


  1. 特征预处理

    通过特定的统计数学方法将数据转化为算法要求的数据。

    sklearn特征抽取API:sklearn.preprocessing

    3.1. 归一化 (类: sklearn.preprocessing.MinMaxScaler)
    通过对原始数据进行变化把数据映射到(默认[0,1])之间,使得特征的数值大小不会影响其重要程度。异常点对最大最小值的影响较大,使得归一化的鲁棒性较差,只适用于精确小规模数据场景。
    机器学习基础算法1-特征工程_第1张图片

    from scikit-learn.preprocessing import MinMaxScaler
    
    X_train = np.array([[ 1., -1.,  2.],
                        [ 2.,  0.,  0.],
                        [ 0.,  1., -1.]])
    
    min_max_scaler = preprocessing.MinMaxScaler()
    X_train_minmax = min_max_scaler.fit_transform(X_train)
    X_train_minmax
    array([[ 0.5       ,  0.        ,  1.        ],
           [ 1.        ,  0.5       ,  0.33333333],
           [ 0.        ,  1.        ,  0.        ]])
    

    3.2. 标准化 (类: sklearn.preprocessing.StandardScaler)
    将原始数据变换到均值为0,标准差为1的分布。在大规模数据的情况下比较稳定,适合嘈杂的数据场景。
    机器学习基础算法1-特征工程_第2张图片

    from sklearn.preprocessing import StandardScaler
    
    X_train = np.array([[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]])
    
    std = StandardScaler()
    X_train_std = std.fit_transform(X_train)
    
    X_train_std
    array([[ 0.        , -1.22474487,  1.33630621],
           [ 1.22474487,  0.        , -0.26726124],
           [-1.22474487,  1.22474487, -1.06904497]])
    

    3.3. 缺失值 (类: sklearn.preprocessing.Imputer)
    删除:不推荐
    填补: 通过行或列平均值、中位数或众数填补

    from sklearn.preprocessing import Imputer
    
    imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
    data = imp.fit_transform([[1, 2], [np.nam, 3], [7, 6]])
    print(data)                          
    [[ 1.          2.]
     [ 4.          3.]
     [ 7.          6.]]
    
  2. 数据降维
    冗余:部分特征间相关性高,浪费计算性能
    噪声:某些特征对预测结果存在负面影响

    4.1 特征选择(类: sklearn.feature_selection.VarianceThreshold)
    单纯地从所有特征中选择部分特征作为训练集特征,特征数量减少,数据不改变。
    主要方法:
    Filter(过滤式): varienceThreshold
    Embedded(嵌入式): 正则化、决策树
    Wrapper (包裹式)

    过滤式:去掉低方差(取值变化小)的特征,移除方差小于某一阈值的所有特征。

    from sklearn.feature_selection import VarianceThreshold
    
    X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
    # 假设我们要移除那些超过80%的数据都为1或0的特征
    sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
    sel.fit_transform(X)
    array([[0, 1],
           [1, 0],
           [0, 0],
           [1, 1],
           [1, 0],
           [1, 1]])
    

    4.2 主成分分析(PCA)(类: sklearn.decomposition.PCA)
    目的是降低数据维数,降低原数据的维度和复杂度,损失少量信息。当特征数量较大时使用。特征数量减少,数据改变。

    from sklearn.decomposition import PCA
    X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    pca = PCA(n_components=0.9) # 若填入整数则是目标特征数量,若填入小数则是目标保留特征比例
    data = pca.fit_transform(X)
    print(data)
    [ 0.99244...  0.00755...]
    

你可能感兴趣的:(机器学习基础算法,机器学习,python)