说明: 本篇文章主要写了机器学习的流程及一些常用的算法如: 贝叶斯,朴素贝叶斯,线性回归,决策树,随机森林,逻辑斯蒂回归,模型调优和特征工程等(都是使用python的sklearn库实现)
一、概述
二、
一、特征工程
在看下面的算法之前,我们要先对机器学习流程进行一下熟悉!
主要有下面几个步骤:
- 获取数据
- 对数据进行清洗
- 对数据集进行
切割为训练集和测试集
- 根据数据的情况对数据做
特征工程
选择合适算法进行模型训练
,然后预测- 使用测试集进行测试数据
- 对模型进行
调优
- 保存模型到文件中
根据数据做特征工程包含如下3个内容:
1. 特征抽取/特征提取
|>字典特征提取, 应用DiceVectorizer
实现对类别特征进行数值化、离散化
|>文本特征抽取,应用CounterVertorize/TfIdfVectorize
实现对文本特征数值化(注意:这一点我们需要使用中文分词,我平常使用的是jieba分词)
|>图像特征抽取(深度学习)
2. 特征预处理
|_>归一化,应用MaxmixScaler
,根据最小最大值进行放缩,默认范围0-1,容易受到异常值的影响,稳定性差
,适合小规模
|_>标准化,应用StandardScaler
, 数据处理到指定的范围内,默认0~1),异常值影响较小,对空值不敏感,大规模也适合
3. 特征降维
|_>特征选择 :
- 低方差过滤(VarianceThreshold
):删除低方差的一些特征
- 特征之间相关性计算(from scipy.stats import pearsonr
):计算特征之间的相关性{
当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱
}
|_>PCA(主要成分分析from sklearn.decomposition import PCA
): 数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息,在此过程中可能会舍弃原有数据、创造新的变量
代码实现,数据的加载使用的是sklearn的数据,有一些数据文件就不上传了,这里只是提供逻辑思路:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
import jieba
import pandas as pd
from scipy.stats import pearsonr
from sklearn.cluster import KMeans
#使用sklearn加载鸢尾花的数据
def datasets_iris():
#1.获取数据的操作和切割数据集
iris= load_iris()
print("查看数据集:",iris)
print("查看数据集的描述:\n",iris["DESCR"])
print("查看特征的名称:\n",iris.feature_names)
print("查看目标值的名称:\n",iris.target_names)
print("查看数据集的特征值:\n",iris.data)
print("查看数据集的目标值:\n",iris.target)
print("查看数据集的类型:\n",iris.data.shape)
# 训练集和测试机的切割
# 参数值(特征值,目标值,测试集的大小,随机数种子)
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=56)
print("训练集的特征值:",x_train)
print("训练集的目标值:",y_train)
print("测试集的特征值:",x_test)
print("测试集的目标值:",y_test)
print("训练集和测试集的特征值形状:",x_train.shape,x_test.shape)
def feature_demo():
"""
特征提取: 使用字典转换器
:return:
"""
# 创建字典数据========one-hot编码转换实现
data1=[{
'city': '北京','temperature':100},{
'city': '上海','temperature':60},{
'city': '深圳','temperature':30}]
#1.创建特征转化器对象(默认转换成稀疏矩阵)
# 注意: 当特征类别过多的时候,一般都会使用稀疏矩阵来标记位置 如果想取消稀疏矩阵,将sparse=False即可
vectorizer1 = DictVectorizer(sparse=False)
#2.使用fit_transform方法进行转化
transfer = vectorizer1.fit_transform(data1)
print("转换过的特征:\n",transfer)
print("特征的名称:\n",vectorizer1.get_feature_names())
print("=================================================\n")
"""
特征提取: 使用文本转换器
"""
#创建文本数据========文本特征提取 CountVectorizer 使用词频来对文章进行权重标识
data2= ["life is short,i like like python", "life is too long,i dislike python"]
#1.创建转换器对象 (英文特征提取,默认按照空格进行切分)
vectorizer2 = CountVectorizer()
#注意:
# 1.上面的这个转换器,我们可以添加stopwords参数,停用词介绍
# 2.如果数据是中文的话,我们需要使用分词工具jieba进行中文分词,然后再进行特征提取
#2.使用fit_transform方法进行转换特征
transfer_word= vectorizer2.fit_transform(data2)
print("(英文文章)转换过的特征:",transfer_word)
print("(英文文章)特征的名称:",vectorizer2.get_feature_names())
"""
特征提取: 使用tfidf文本转换器
"""
#使用TF-IDF实现中文特征抽取 TfidfVectorizer 使用 TF:词频 和 IDF 逆文档频率(总文件数/出现这个词语的文件个数) 来进行计算权重
data3 = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
#1.创建TIIDF特征提取转换器
vectorizer3= TfidfVectorizer(stop_words=['一种', '不会', '不要'])
text_list = []
"""
使用jieba 分词将中文进行分词,再组合
"""
for sent in data3:
text_list.append(cut_word(sent))
print(text_list)
transfer_tfidf = vectorizer3.fit_transform(text_list)
print("tfidf特征提取:",transfer_tfidf)
print("tfidf特征名称:",vectorizer3.get_feature_names())
def minmax_demo():
"""
特征预处理: 归一化 缺点: 算法中的最大值最小值容易受到异常点的影响
:return:
"""
#1.读取文件
datingData = pd.read_csv("../datingTestSet2.txt",sep="\t")
print("原始数据:\n",datingData)
#2.创建归一化转化器
minmaxScaler = MinMaxScaler()
#3.使用fit_transform方法
tranfer = minmaxScaler.fit_transform(datingData)
print("归一化后的数据:\n",tranfer)
def stan_demo():
"""
特征预处理: 标准化处理 算法: 对归一化进行了优化,将最大值和最小值改为了平均值,在拥有少量数据量的情况下,对结果的影响不大
:return:
"""
#1.读取数据
datingData= pd.read_csv("../datingTestSet2.txt",sep="\t")
#2.创建标准化转换器对象
stanScaler=StandardScaler()
#3.使用fit_transform方法转换
tranfer = stanScaler.fit_transform(datingData)
print("标准化处理后的特征值:\n",tranfer)
def variance_demo(