机器学习之特征工程(1.0)
2.1 数据集
Kaggle网址:https://www.kaggle.com/datasets
UCI数据集网址: http://archive.ics.uci.edu/ml/
scikit-learn网址:http://scikit-learn.org/stable/datasets/index.html#datasets
2.1.1 数据集获取
1. 安装
pip3 install Scikit-learn==0.19.1
安装好之后可以通过以下命令查看是否安装成功
import sklearn
- 注:安装scikit-learn需要Numpy, Scipy等库
2. scikit-learn数据集API介绍
- sklearn.datasets
- 加载获取流行数据集
- datasets.load_*()
- 获取小规模数据集,数据包含在datasets里 如:sklearn.datasets.load_iris()
- datasets.fetch_*(data_home=None)
- 获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
- 如:sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
- datasets.base.Bunch(继承自字典)
2.1.2 数据集的划分
机器学习一般的数据集会划分为两个部分:
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
划分比例:
- 训练集:70% 80% 75%
- 测试集:30% 20% 30%
数据集划分api
- sklearn.model_selection.train_test_split(arrays, *options)
- x 数据集的特征值
- y 数据集的标签值
- test_size 测试集的大小,一般为float
- random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
- return 测试集特征训练集特征值值,训练标签,测试标签(默认随机取)
-
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split def datasets_demo(): """ sklearn数据集使用 :return: """ # 获取数据集 iris = load_iris() print("鸢尾花数据集:\n", iris) print("查看数据集描述:\n", iris["DESCR"]) print("查看特征值的名字:\n", iris.feature_names) print("查看特征值:\n", iris.data, iris.data.shape) # 数据集划分 x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22) print("训练集的特征值:\n", x_train, x_train.shape) return None
-
2.2特征工程
-
sklearn 特征工程
pandas 数据清洗、数据处理 -
from sklearn.feature_extraction import DictVectorizer def dict_demo(): """ 字典特征抽取 :return: """ data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}] # 1、实例化一个转换器类,稀疏矩阵节省空间 transfer = DictVectorizer(sparse=True) # 2、调用fit_transform() data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray(), type(data_new)) print("特征名字:\n", transfer.get_feature_names()) return None
- 英文文本特征抽取
-
from sklearn.feature_extraction.text import CountVectorizer def count_demo(): """ 文本特征抽取:CountVecotrizer :return: """ data = ["life is short,i like like python", "life is too long,i dislike python"] # 1、实例化一个转换器类 transfer = CountVectorizer() # transfer = CountVectorizer(stop_words=["is", "too"]) # 2、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None
中文文本特征抽取
-
from sklearn.feature_extraction.text import CountVectorizer import jieba def cut_word(text): """ 进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门" :param text: :return: """ return " ".join(list(jieba.cut(text))) def count_chinese_demo2(): """ 中文文本特征抽取,自动分词 :return: """ # 将中文文本进行分词 data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。", "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。", "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"] data_new = [] for sent in data: data_new.append(cut_word(sent)) print(data_new) # 1、实例化一个转换器类 transfer = CountVectorizer(stop_words=["一种", "所以"]) # 2、调用fit_transform data_final = transfer.fit_transform(data_new) print("data_new:\n", data_final.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None
Tf-idf文本特征提取(Tf-idf = TF * IDF)
- 用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
-
TF - 词频(term frequency,tf)
IDF - 逆向文档频率
-
注释: TF-IDF - 重要程度 两个词 “经济”,“非常” 1000篇文章-语料库 100篇文章 - "非常" 10篇文章 - “经济”
两篇文章 文章A(100词) : 10次“经济” TF-IDF:0.2 tf:10/100 = 0.1 idf:lg 1000/10 = 2 文章B(100词) : 10次“非常” TF-IDF:0.1 tf:10/100 = 0.1 idf: log 10 1000/100 = 1from sklearn.feature_extraction.text import TfidfVectorizer import jieba def cut_word(text): """ 进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门" :param text: :return: """ return " ".join(list(jieba.cut(text))) def tfidf_demo(): """ 用TF-IDF的方法进行文本特征抽取 :return: """ # 将中文文本进行分词 data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。", "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。", "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"] data_new = [] for sent in data: data_new.append(cut_word(sent)) # print(data_new) # 1、实例化一个转换器类 transfer = TfidfVectorizer(stop_words=["一种", "所以"]) # 2、调用fit_transform data_final = transfer.fit_transform(data_new) print("data_new:\n", data_final.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None