kaggle地址 | UCI数据集网址|scikit_learn网址
注意:有些数据集可以没有目标值
字典特征抽取:把字典中的一些类别数据,分别转化成特征值。
from sklearn.feature_extraction import DictVectorizer def dictves(): """ 字典数据抽取 :return:None """ # 实例化 dict = DictVectorizer() # 调用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) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.01.统计所有文章出现的所有词 2.每个词只统计一次 3.单个词不统计 4.文本特征抽取适用于情感分析
def countves(): #适用于情感分析 """ 对文本进行特征值化 :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]]思考:如何去对中文进行特征值化
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer import jieba def cutword(): 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 def hanzivec(): """ 中文特征值化 :return:None """ c1, c2, c3 = cutword() print(c1, c2, c3) cv = CountVectorizer() data = cv.fit_transform([c1, c2, c3]) # 返回的是sparse矩阵 print(cv.get_feature_names()) print(data.toarray()) print(data) # 返回的是sparse矩阵 return None 输出:今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。 我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。 如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。通过jieba.cut将句子分割成一个字符串,每个词用空格隔开。
输出:['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样'] [[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0] [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1] [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]] (0, 6) 2 (0, 26) 2 (0, 22) 2 (0, 12) 1 (0, 32) 1 (0, 31) 1 (0, 14) 1 (0, 24) 1 (0, 19) 1 (0, 27) 1 (0, 2) 1 (0, 20) 1 (1, 18) 3 (1, 28) 2 (1, 23) 1 (1, 7) 1 (1, 8) 1 (1, 3) 1 (1, 9) 1 (1, 35) 1 (1, 17) 1 (1, 34) 1 (2, 18) 1 (2, 16) 1 (2, 11) 1 (2, 0) 1 (2, 21) 1 (2, 4) 4 (2, 25) 1 (2, 5) 3 (2, 1) 1 (2, 29) 2 (2, 13) 1 (2, 30) 1 (2, 10) 1 (2, 15) 1 (2, 33) 1def tfidfvec(): """ 中文特征值化 :return: None """ c1, c2, c3 = cutword() print(c1, c2, c3) tf = TfidfVectorizer() data = tf.fit_transform([c1, c2, c3]) print(data) print(tf.get_feature_names()) print(data.toarray()) return None 输出:[[0. 0. 0.21821789 0. 0. 0. 0.43643578 0. 0. 0. 0. 0. 0.21821789 0. 0.21821789 0. 0. 0. 0. 0.21821789 0.21821789 0. 0.43643578 0. 0.21821789 0. 0.43643578 0.21821789 0. 0. 0. 0.21821789 0.21821789 0. 0. 0. ] 反应的是重要性
什么时候进行归一化? 答:多个特征同等重要是进行归一化。
from sklearn.preprocessing import MinMaxScaler, StandardScaler def mm(): """ 归一化处理 :return: None """ mm = MinMaxScaler() # feature_range=(2,3) 不写默认(0,1) data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]) print(data) return None 输出:[[1. 0. 0. 0. ] [0. 1. 1. 0.83333333] [0.5 0.5 0.6 1. ]]from sklearn.impute import SimpleImputer # 0.22版本的sklearn,imputer不在preprocessing里了,而是在sklearn.impute里 import numpy as np def im(): """ 缺失值处理 :return:NOne """ # NaN, nan im = SimpleImputer(strategy='mean') data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]]) print(data) return None 输出:[[1. 2.] [4. 3.] [7. 6.]]
from sklearn.feature_selection import VarianceThreshold def var(): """ 特征选择-删除低方差的特征 :return: None """ var = VarianceThreshold(threshold=1.0) # 删除方差默认值为threshold=0.0 data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]) print(data) return None 输出:[[0] [4] [1]]
特征数据达到上百时,就要考虑要不要用PCA简化数据。当然数据也会改变,特征数据也会减少。 高纬度数据容易出现的问题: 1.特征之间通常是相关的。
详细说明请详看机器学习之PCA主成分分析博客
from sklearn.decomposition import PCA def pca(): """ 主成分分析进行特征降维 :return: None """ pca = PCA(n_components=0.9) # 保存90%,如果为整数则为减少到的特征数量 data = pca.fit_transform([[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]) print(data) return None if __name__ == "__main__": pca() 输出:[[ 1.28620952e-15 3.82970843e+00] [ 5.74456265e+00 -1.91485422e+00] [-5.74456265e+00 -1.91485422e+00]]