机器学习所需要的环境
1.Python的安装
2.Numpy:Python语言的科学计算库支持,提供了线性代数、傅里叶变换等非常有用的数学工具
3.Scikit-Learn:针对Python 编程语言的免费软件机器学习库,里面包含了各种常见的机器学习算法
4.Pandas:Python语言中知名的数据处理库
5.Scipy:Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题
机器学习的开发流程
1.获取数据
2.数据处理
3.特征工程
4.机器学习算法训练–模型
5.模型评估
6.应用
初学机器学习时,遇到最大的问题就是迷茫,对此我深有体会,面对机器学习领域数量繁多由互有交叉的知识点,就像身处一大片繁茂的森林,没有指南设备很难不迷失方向,就比如我刚学习时打开课本看到的是这样的一幅画面
各种密密麻麻的数学公式让人很苦恼,根本读不下去,所以我个人认为学习机器学习比较有效的方法就是先确定主题,然后勾勒整体脉络,最后才是添加细节。
接下来我要介绍的就是关于特征工程的内容,以及代码的演示
1.调用数据集,数据集划分
这里我们调用sk-learn中经典的鸢尾花数据集进行演示,这里需要调用sk-learn中的数据集
运行结果如图
我们可以看到返回的数据集是字典对象,用train_test_split函数可以把数据集划分成我们指定百分比训练集和测试集
2.字典特征提取
def dic_demo():
#字典特征提取
data=[{'city':'北京', 'temperature':'100'}, {'city':'上海', 'temperature':'60'}, {'city':'深圳', 'temperature':'30'}]
#实例化一个转换器类
transfer=DictVectorizer(sparse=False)
data_new=transfer.fit_transform(data)
print("data_new:\n",data_new)
print("特征名字:\n",transfer.get_feature_names())
return None
这里同样需要导包
from sklearn.feature_extraction import DictVectorizer
在我们实例化转化器类时,它默认返回的是一个spars(稀疏)矩阵,如图所示
如果想要返回二维数组的话我们需要让DictVectorizer中的参数改为sparse=False
3.英文文本提取
def count_demo():
#英文文本特征提取
data=["life is too short,i like like python", "life is too long,i dislike python"]
transfer=CountVectorizer(stop_words=["is","too"])
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
导包
from sklearn.feature_extraction.text import CountVectorizer
CountVectorizer统计样本单词出现的数量
stop_words 表示将我们认为关联性不大的关键词给剔除
4.中文文本提取
def count_chinese_demo():
中文文本特征提取
data = ["我 爱 北京 天安门", "天安门 的 太阳 升起"]
transfer = CountVectorizer()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
此函数会自动提取中文文本里面的关键词,并返回一个统计关键词数量的数组
不过这种方法有个弊端,就是需要我们自己手动分词
我们可以创建一个中文分词函数,调用jieba库函数进行自动分词,不过调用这个拓展库之前要先安装
def cut_word(text):
'''
进行中文分词
:param text:
:return:
'''
str=" "
text = str.join(list(jieba.cut(text)))
return text
然后我们可以在中文分词的函数中调用这个函数
def count_chinese_demo():
#中文文本特征提取
# data = ["我 爱 北京 天安门", "天安门 的 太阳 升起"]
# transfer = CountVectorizer()
# data_new = transfer.fit_transform(data)
# print("data_new:\n", data_new.toarray())
# print("特征名字:\n", transfer.get_feature_names())
data=["实现中华民族伟大复兴的中国梦,就是要实现国家富强,民族振兴,人民幸福",
"中国梦归根到底是人民的梦,必须紧紧依靠人民来实现,必须不断为人民造福",
"我们将高举和平、发展、合作、共赢的旗帜,始终不渝走和平发展道路,始终不渝奉行互利共赢的开放战略"]
data_new=[]
for word in data:
data_new.append(cut_word(word))
print(data_new)
transfer = CountVectorizer()
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
你以为这样文本特征的抽取就完美了吗,当然不是的,就比如不同类型的文章当中都会出现大量的例如 ‘因为’ ‘所以’ 这样的词,这样的词可以作为关键词供我们分类吗,答案当然是否定的,那么如何解决这种问题呢,这就需要用到TfidfVectorizer函数
TfidfVectorizer函数的中心思想就是如果一个词在某种文章中出现次数很多,在其他文章中出现很少,那么这个词就可以更适合用来分类
如够用tf来表示词频的话(即一个词在文件中出现的频率)用idf来表示逆向文档频率(即代表一个词普遍重要性的度量,可以由文件总数除以包含该词语的文件数目,再将得到的商取以10为底的对数得到)那么词的重要程度tfidf就等于tf*idf
def tfidf_demo():
"""
用tfidf的方法进行文本特征抽取
:return:
"""
data = ["实现中华民族伟大复兴的中国梦,就是要实现国家富强,民族振兴,人民幸福",
"中国梦归根到底是人民的梦,必须紧紧依靠人民来实现,必须不断为人民造福",
"我们将高举和平、发展、合作、共赢的旗帜,始终不渝走和平发展道路,始终不渝奉行互利共赢的开放战略"]
data_new = []
for word in data:
data_new.append(cut_word(word))
print(data_new)
transfer = TfidfVectorizer()
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
代码和之前的一样,只需要把CountVectorizer改成TfidfVectorizer就行了,而且导包时只需要在CountVectorizer的后面添加上逗号和TfidfVectorizer就行了
5.数据预处理–归一化
为什么数据要进行归一化呢,就比如图中的一组数据,不同特征的值差别可能会很大,这时候我们进行特征提取时就会对我们的结果产生很大的影响,导致特征值比较小的特征就影响就很小,这时候就需要进行归一化,使每个特征同等重要
归一化
公式
z = (x - min) / (max - min)
对每个值x,减去其所在列的最小值min,再除以所在列的极差(最大值与最小值之差),得到的就是归一化后的值z。每列的归一化独立进行,归一化后的数据每列的取值范围为[0, 1]。
def minmax_demo():
"""
归一化数据
:return:
"""
data=pd.read_csv('data.csv')
data=data.iloc[:,:3]
print("data:\n",data)
#实列化一个转换器类
transfer = MinMaxScaler()#默认MinMaxScaler(feature_range=[0,1])
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
数据经过归一化之后就会把特征值都化成我们指定的范围内
导入数据时我们可以先把信息在excel中进行填写,然后把它另存为csv文件,然后再通过pd.read_csv(‘data.csv’)将我们文件中的数据存入到我们的数据中
这里需要导包
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
归一化后图中数据如下
6.数据预处理–标准化
但是归一化也有一个缺点,就是容易受到异常值的影响,只适用于小数据的处理场景
标准化就是对数据进行变换,把数据变换为均值为0标准差为1的范围内
标准化
公式
z = (x - u) / s
对每个值x,减去其所在列的平均值u,再除以所在列的标准差s,得到的就是标准化后的值z。每列的标准化独立进行,标准化后的数据每列的均值为0,标准差为1。
def stand_demo():
"""
标准化
:return:
"""
data = pd.read_csv('data.csv')
data = data.iloc[:, :3]
print("data:\n", data)
# 实列化一个转换器类
transfer = StandardScaler()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
导包
from sklearn.preprocessing import StandardScaler
7.降维
降维是指在某些特定条件下,降低特征个数,得到一组‘不相关’主变量的过程
降维的两种方式:
1.特征选择
Fitter过滤式:主要探究特征本身特点、特征与特征和目标值之间的关系
1.方差选择法—低方差过滤
2.相关系数—特征与特征之间的相关程度
def variance_demo():
"""
低方差特征过滤
:return:
"""
data = pd.read_csv('data.csv')
data = data.iloc[:, :]
print("data:\n", data)
# 实列化一个转换器类
transfer = VarianceThreshold()#里面参数threshold=多少需要我们自己设置,默认为0
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new,data_new.shape)在这里插入代码片
导包
from sklearn.feature_selection import VarianceThreshold
经过低方差过滤后,原本6个特征,不过最后一个boolean特征方差为0就被过滤掉了,只剩下了5个特征
def variance_demo():
"""
低方差特征过滤
:return:
"""
data = pd.read_csv('data.csv')
data = data.iloc[:, :]
print("data:\n", data)
# 实列化一个转换器类
transfer = VarianceThreshold()
#计算相关系数
r=pearsonr(data["litters"],data["milage"])
print("相关系数:\n",r)
导包
from scipy.stats import pearsonr
这里我计算的是litters与milage两个特征之间的相关系数
如果特征与特征之间相关性系数很高的话
1.选择其中一个作为代表
2.加权求和
3.主成分分析(即自动地将一些相关性很强的特征处理掉)
主成分分析
定义:高维数据转化为低维数据的过程,此过程中可能会舍弃原有数据,创造出新的变量
作用:使数据维数压缩,尽可能地将降低原数据的维数,损失少量信息
def pca_demo():
data=[[2,8,4,5],[6,3,8,8],[5,4,0,1]]
transfer=PCA(n_components=2)#整数的话代表把特征量降低到多少
#这里如果是小数的话表示保存多少的信息
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
导包
from sklearn.decomposition import PCA
这里原本4个特征,此时已经被降为两个