机器学习入门(一)个人学习笔记

写在前面,学习完爬虫的知识,下一步打算学习机器学习的相关知识,课程来源同样来自于 黑马程序员:http://yun.itheima.com/course/366.html

第一课 特征工程及数据的处理

数据集

  • Kaggle:数据量大,准确,数据真实
  • UCI:收录数据集比较专业,覆盖领域广泛
  • scikit-learn:自带数据集,数据量比较小,方便学习
  • 常用数据集的结构
    • 结构 = 特征值 + 目标值
    • Pandas工具 sklearn模块

特征工程

  • 特征工程是什么
    • 将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高了对未知数据预测的准确性
  • 特征工程的意义
    • 直接影响预测结果
  • scikit-learn工具
    • python语言机器学习工具
    • 包含很多机器学习算法的实现
    • 文档完善,容易上手
    • 稳定版本0.19
  • 数据的特征抽取
    • sklearn特征抽取API:sklearn.feature_extraction

      • 对字典进行特征抽取
      • 把字典中的一些类别数据,分别转化为特征
      • 类: sklearn.feature_extraction.DictVectorizer
        • 处理完了之后默认返回sparse矩阵格式,为了节约内存,方便读取处理
      • 数组形式,有类别的特征,先要转换为字典数据
    • one-hot编码:把类别抽取成one-hot编码防止错乱

    • 文本特征抽取

      • 类sklearn.feature_extaction.text.CountVectorizer
      def countVec():
          cv = CountVectorizer()
          data = cv.fit_transform(["life is short, i use python","life is too long , i dislike use python"])
          print(cv.get_feature_names()) #统计文章中出现的词
          print(data.toarray()) #对每篇文章进行统计每个词出现的次数
          return None
      

      [图片上传失败...(image-9bd1d-1535030367186)]

      注意:单个字母不统计,因为单个字母的词没有分类标准,这也可以反映出,文本分析的一个应用就是分析文章的感情倾向。

      • 中文字符处理:

        • jieba模块的导入
          • pip3 install jieba
        • con = jieba.cut("待分词的文章")

        这个时候返回的是一个迭代器(分类器),还没有达到我们在countVec中需要的

        • content = list(con)

        把结果转化为列表

        • "".join(conte)

        转字符串

       
       def cutwords():
         con1 = jieba.cut("故事从男主回国寻找一个(也)会超能力的神秘人开始,找到地方的时候人已经没了")
         con2 = jieba.cut("不过,这却丝毫没有影响这部片子的质量,毕竟影片的主演是两位颜值与演技齐在线的全民男神!")
         con3 = jieba.cut("那时的本尼与汤老湿虽然还没有像现在这样大红大紫,但两人演起戏来却毫不含糊,演技照现在更是不差分毫。 ")
         content1 = list(con1)
         content2 = list(con2)
         content3 = list(con3)
         c1 = " ".join(content1)
         c2 = " ".join(content2)
         c3 = " ".join(content3)
         return c1,c2,c3
      

      我们在countVec中需要的是一个字符串列表,我们可以把countVec中的两个句子换成中文,不难发现,如果中文字符串不做任何处理,直接交由实例进行处理,分词默认的法则是按“中断字符”(我这么称呼它,就是两个词语之间的中断,如空格 逗号),当我们用jieba库进行处理之后,得到的其实是一个词语的迭代器,我们先把它转化为字典,再转化为字符串,事实上就是去给原来的句子中的分词加上空格,这个其实也可以由我们自己来做,但如果比较长的文章,这么做肯定是不合适的。

      • tf*idf 重要性程度
        • TF(term frequency)词频
        • idf(inverse document frequency) 逆文档频率
          • 计算方法:log(总文档数量/该词出现的文档数量)
        • 类:sklearn.feather_extraction.text.TfidfVectorizer
          • TfidfVectorizer(stop_words = None,...)
        def TfidfVec():
            c1,c2,c3 = cutwords()
            print("分词结果1:", c1)
            print("分词结果2:", c2)
            print("分词结果3:", c3)
            TfidfVec = TfidfVectorizer()
            data = TfidfVec.fit_transform([c1,c2,c3])
            print(TfidfVec.get_feature_names())
            print(data.toarray())
            return None
        
        • 应用场景相比countVec更好一些。
  • 数据的特征预处理
    • 对数据进行处理:通过特定的统计方法(数学方法),把数据转换成算法需要的数据。
    • 类: sklearn.preprocessing
    • 归一化
      • 通过对原始数据进行变换,把数据映射到(默认[0,1])之间
      • 目的:使得某一个特征,对结果不会造成更大的影响
        [图片上传失败...(image-66c8b8-1535030367186)]
      • 实例化 'MinMaxScalar'
      • 通过 fit_transform转换
      • 数据中异常点较多,此时归一化的效果就不是很好,所以归一化的鲁棒性较差,只适合传统的精确小数据场 景。

    K-近邻算法:计算每两个点之间的欧氏距离,需进行归一化的原因是,使任何一个特征值对结果的影响是一样的(可控制的)。

    • 标准化
      • 特点:通过对原始数据进行变换把数据变换到均值为0,方差为1的范围内。
        [图片上传失败...(image-a71870-1535030367186)]
      • 标准化的优势是用到平均值(求方差和标准差),所以异常点对整体影响不大。其中方差,考量了数据的稳定性,可以直接看出数据的离散程度(数据比较集中,则方差较小,数据分散,方差较大)。当数据具有一定规模时,少量的异常点,对整体影响不大。
      • StandardScaler()
        • 处理之后每列来说所有数据都聚集在均值为0标准差为1
        • StandardScaler.fit_transform(X)
          • X是numpy array格式的shuj
          • 返回值是相同形状的array
        • StandardScaler.means_
          • 原始数据中每列特征的平均值
        • StandardScaler.std_
          • 原始数据中每列特征的方差
  • 数据的降维
    • 维度:特征的数量
    • 特征选择:
      • 从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前后可以改变值,也可以不改变值。但选择后的特征维度肯定比选择前小。
    • 特征选择的原因
      • 冗余:部分特征相关度高,容易消耗计算机性能
      • 噪声:部分特征对预测结果有影响
    • 主要方法:过滤式(Filter)、嵌入式(Embadded)、包裹式(Wrapper)
      • 过滤式 特征选择 API:
        • sklearn.feature_selection.VarianceThreshold
    • ** 神经网络 ** 也是一种重要的特征选择方法
    • 主成分分析(PCA):使数据维数压缩,尽可能降低源数据的维数(复杂度),损失少量信息。
      • 特征数量很多(几百个以上)
      • 考虑数据简化
      • 数据会改变,特征数量会减少,但所有数据信息不会损耗很大。
      • 可以削弱回归分析或者聚类分析中特征的数量
      • 问题:特征之间是相关的
      • PCA语法:
        • PCA(n_components = None)
          • 参数n_components有两个选择
          • 小数的时候(01之间)是保留的特征部分,一般取90%95%
          • 整数的时候,是特征删除后,还剩下的维度。
        • PCA.fit_transform()

你可能感兴趣的:(机器学习入门(一)个人学习笔记)