写在前面,学习完爬虫的知识,下一步打算学习机器学习的相关知识,课程来源同样来自于 黑马程序员: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)
转字符串
- jieba模块的导入
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_
- 原始数据中每列特征的方差
- 特点:通过对原始数据进行变换把数据变换到均值为0,方差为1的范围内。
- 数据的降维
- 维度:特征的数量
- 特征选择:
- 从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前后可以改变值,也可以不改变值。但选择后的特征维度肯定比选择前小。
- 特征选择的原因
- 冗余:部分特征相关度高,容易消耗计算机性能
- 噪声:部分特征对预测结果有影响
- 主要方法:过滤式(Filter)、嵌入式(Embadded)、包裹式(Wrapper)
- 过滤式 特征选择 API:
- sklearn.feature_selection.VarianceThreshold
- 过滤式 特征选择 API:
- ** 神经网络 ** 也是一种重要的特征选择方法
- 主成分分析(PCA):使数据维数压缩,尽可能降低源数据的维数(复杂度),损失少量信息。
- 特征数量很多(几百个以上)
- 考虑数据简化
- 数据会改变,特征数量会减少,但所有数据信息不会损耗很大。
- 可以削弱回归分析或者聚类分析中特征的数量
- 问题:特征之间是相关的
- PCA语法:
- PCA(n_components = None)
- 参数n_components有两个选择
- 小数的时候(01之间)是保留的特征部分,一般取90%95%
- 整数的时候,是特征删除后,还剩下的维度。
- PCA.fit_transform()
- PCA(n_components = None)