赞
踩
基础不牢,地动山摇。直接上手tf,连很多机器学习的基础包都不会使用。比如sklearn, pandas (使用sklearn 来做特征工程 , pandas 用于数据的清洗和数据的处理)这些数据处理库,因此回去回炉重造,学习机器学习先。 学习的视频是黑马程序员的机器学习视频。
视频和资料链接 提取码:1234
本篇文章内容:
开发流程
1)获取数据
2)数据处理
3)特征工程
4)机器学习算法训练 - 模型
5)模型评估
6)应用
第一天内容主要讲了前3项内容。使用sklearn完成一系列数据处理的工作。
sklearn 包中包含了很多数据集。比如波士顿的房价信息,鸢尾花数据集等等。小数据集,下载sklearn的时候也顺带下载了,如果是大数据集还需要另外去下载。
1.sklearn.datasets
load* 获取小规模数据集 已经保存到了本地
fetch_* 获取大规模数据集 还需要从网上下载这个数据集
数据集是以字典的方式返回的,所以调用数据的时候可以有两种调用方式。 1)dict["key"] = values
2)dict.key = values
学习任何一个深度学习视频都知道,有了数据,需要将数据分成训练集和测试集。 sklearn中使用train_split将数据集分开: sklearn.model_selection.train_split(array, *options)
x:数据集的特征值
y:数据集的标签值
test_size 测试集的大小,一般为float
random_state 随机数种子
return 训练集特征值(x_train),测试纸的特征值(x_test),训练集的目标值(y_train),测试集的目标值(y_test)
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
输出结果:iris数据集内容,DESCR描述,feature,data.shape
提取特征的步骤:
def dict_demo():
"""
字典特征抽取
:return:
"""
data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
# 1、实例化一个转换器类
transfer = DictVectorizer(sparse=False)
# 2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new(), type(data_new))
print("特征名字:\n", transfer.get_feature_names())
return None
输出
data_new:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]] <class 'scipy.sparse.csr.csr_matrix'>
特征名字:
['city=上海', 'city=北京', 'city=深圳', 'temperature']
这种方式的输出有很多0(即冗余),因此我们通常使用sparse参数,只输出有数值部分的坐标。
transfer = DictVectorizer(sparse=True)
输出
data_new:
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0 <class 'scipy.sparse.csr.csr_matrix'>
特征名字:
['city=上海', 'city=北京', 'city=深圳', 'temperature']
使用sklearn.feature_extraction.text的CountVectorizer。 调用方式同上:
def count_demo():
"""
文本特征抽取:CountVecotrizer
:return:
"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、实例化一个转换器类
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
CountVectorizer(stop_words=["is", "too"])通过stop_words 可以去除统计一些word的词频。
输出
data_new:
[[0 1 2 0 1 1]
[1 1 0 1 1 0]]
特征名字:
['dislike', 'life', 'like', 'long', 'python', 'short']
这个是通过空格来区分单词,对于中文而言,单词间就没有空格,因此需要多一步操作。这里调用一个能够分词的库: jieba
import jieba
def cut_word(text):
"""
进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
"""
return " ".join(list(jieba.cut(text)))
#join函数,就是将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
如何判断一篇文章在说什么? 没错,就是关键词! 在谷歌之前的搜索,都是通过一篇文章中,词的出现频率来对结果进行搜索排序。谷歌搜索的创新就是在于将引用最多的文章放到最前面。所以并不是说一个单词出现的频率越高这个单词就越重要。应该是这篇文章有,而其他文章没有的单词,这个才更有辨识度。
在sklearn库中,TfidfVectorzer负责这个功能(这个函数比前面根据词频的函数用的更多)
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
为了有一个量纲,不要让一些数值小的参数被数值大的参数所掩盖,所以我们使用归一化处理,让大家在同一起跑线。 计算公式: mx,mi是你指定区间的数值大小。
读入数据使用Pandas的read_csv()函数。 归一化的函数
def minmax_demo():
"""
归一化
:return:
"""
# 1、获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:, :3] #只取数据的前三列数据
print("data:\n", data)
# 2、实例化一个转换器类
transfer = MinMaxScaler(feature_range=[2, 3])
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
归一化的缺点:如果有几个数值异常,那么就会影响整个归一化矩阵。所以引入了标准化
调用sklearn中的StandardScaler()函数
def stand_demo():
"""
标准化
:return:
"""
# 1、获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = StandardScaler()
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
降维:顾明思议,就是降低数据的维度(减少不重要的信息,加快处理的速度)
如果两个数据的方差很大,则这个数据有意义。
特征方差小:某个特征大多样本相近,那么这些数据就是冗余
特征=方差大:那么这些特征都有意义,需要保留。
最后如何去表达两遍参数之间的相关程度呢? 这里我们使用相关系数来表示两个变量的相关程度,公式如下 比如我们的x,y如下图所示
计算结果
相关系数为+0.9942>0,因此x,y是呈现正相关。
计算相关性使用到了scipy库。 numpy,scipy的关系图:
来自Python numpy,scipy,pandas这些库的区别是什么?
库的调用方法同上: 1)先实例化一个转换器类 2)调用fit_transform
from sklearn.feature_selectioarn.decomposition import PCA
from scipy.stats import pearsonr
def variance_demo():
"""
过滤低方差特征
:return:
"""
# 1、获取数据
data = pd.read_csv("factor_returns.csv")
data = data.iloc[:, 1:-2]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = VarianceThreshold(threshold=10) #去除低方差数据
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new, data_new.shape)
# 计算某两个变量之间的相关系数
r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
print("相关系数:\n", r1)
r2 = pearsonr(data['revenue'], data['total_expense'])
print("revenue与total_expense之间的相关性:\n", r2)
plt.figure(figsize=[20, 8], dpi=100) # figsize 设定fig的长宽高
plt.scatter(data['revenue'], data['total_expense'])
plt.show()
return None
降维中,PCA降维用的比较多,我觉得比较好的PCA讲解视频:中字 主成分分析法(PCA)| 分步步骤解析 看完你就懂了! PCA的原理比较复杂,这个视频我觉得讲的很通俗和清楚。如果只是想学一下如何调用就无需关系。看代码就行。 PCA降维代码
from sklearn.decomposition import PCA
def pca_demo():
"""
PCA降维
:return:
"""
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 1、实例化一个转换器类
#n_components=小数, 表示保留百分之多少的信息
#整数;减少到多少特征
transfer = PCA(n_components=0.95)
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
n_components=小数, 表示保留百分之多少的信息;若为整数;减少到多少特征
完,以上为Day1的内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。