前言:鸢尾花数据集是机器学习中的经典小规模数据集。通过如下实验,查阅资料和视频进行学习,将整个实验的学习心得和实验过程作出分享,希望对喜爱机器学习并入门的新手提供帮助,同时也鞭策自己稳步向前。
== 本文主要从“实验前期的基本功课,实验过程的重要实现,实验结束的学习总结”三部分进行编写,限于文章篇幅,后续内容将在后边的博文中更新,大家可自行对应阅读:==
(实验的内容要求和相关介绍点击这里跳转至第一篇博文)
(一)实验前期的基本功课:
数据集的划分:
- 机器学习一般的数据集合会划分为两个部分,训练集S和测试集T
- 在西瓜书几种不同的划分方式:留出法,交叉验证法,自助法等(P25-P28)
- 它们的划分比例按照对应规则各有不同:一般来讲,它们的划分比例一般为:
- 训练集:70~80%,默认约75%
- 测试集:20~30%,默认约25%
数据集划分 api:
- sklearn.model_selection.train_test_split( x, y, test_size, random_state )
- x 数据集的特征值
- y 数据集的标签值
- test_size 测试集的大小,一般为float,传入0.2,代表测试集20%,测试集80%,不传默认 25%
- random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
- return 训练集特征值,测试集特征值,训练集的目标值,测试集的目标值(默认随机取)
核心代码如下:
from sklearn.datasets import load_iris,fetch_20newsgroups
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
iris=load_iris()
iris_data=pd.DataFrame(data=iris.data,columns=['Sepal_Length','Sepal_Width','Petal_Length','Petal_Width'])
iris_data["target"]=iris.target
def iris_plot(data,col1,col2):
sns.lmplot(x=col1,y=col2,data=data,hue="target",fit_reg=False)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title("鸢尾花数据展示")
plt.xlabel(col1)
plt.ylabel(col2)
plt.show()
x_train,x_test,y_train,y_test=train_test_split(iris_data,iris.target)
print("训练集的特征值是:\n",x_train)
print("测试集的特征值是:\n",x_test)
print("训练集的目标值是:\n",y_train)
print("测试集的特目标值是:\n",y_test)
运行结果如下:
我们注释掉前边的四行print,添加下边两行代码,可以看到训练集和测试集的占比,得出大概比例分别为75%和25%:
print("训练集的目标值的形状:\n",y_train.shape)
print("测试集的特目标值形状:\n",y_test.shape)
运行结果如下:
怕大家弄混,对目标值和特征值做补充(下图来自博文,点击进入):
改一下,让训练集和测试集的占比相同,加上参数test_size=0.5:
x_train,x_test,y_train,y_test=train_test_split(iris_data,iris.target,test_size=0.5)
运行效果:
random_state,随机数种子,下边通过实例演示:
x_train1,x_test1,y_train1,y_test1=train_test_split(iris_data,iris.target,test_size=0.2,random_state=2)
x_train2,x_test2,y_train2,y_test2=train_test_split(iris_data,iris.target,test_size=0.2,random_state=22)
print("测试集的目标值是:\n",y_test1)
print("测试集的目标值是:\n",y_test2)
运行效果: 总结:在需要设置random_state的地方给其赋一个值,当多次运行此段代码能够得到完全一样的结果,别人运行此代码也可以复现你的过程。若不设置此参数则会随机选择一个种子,执行结果也会因此而不同了,关于随机数种子的应用,请点击此处查看博文进行详细了解。
特征工程-特征预处理:
首先回顾几个概念:
特征工程:将原始数据转换为更好地代表预测模型潜在问题的特征的过程,从而提高了对未知数据的预测准确性。 特征抽取 :对文本等数据进行特征值化, 让计算机更好的理解数据。 对字典特征抽取 :对字典数据进行特征值化. 主要是对类别特征进行One-hot编码。
特征预处理在scikit-learn上的解释:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。 为什么要通过特征预处理来使数据达到归一化/标准化? 如下四个特征,单位或大小有差别,再如特征1和2的方差相比也很大,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征(很多博文举这个例子作为引例,原创未知,此处不加引用): 最终得到:
特征预处理包含内容(数值型数据的无量纲化):归一化和标准化(Normalizing和 Standardizing): 在对归一化和标准化了解之前,首先来看特征预处理API:
sklearn.preprocessing
1. 归一化
定义:也就是我们常说的0-1归一化,通过对原始数据进行变换把数据映射到默认为【0,1】之间 归一化目的:使得一个特征对结果不会造成更大的影响 公式: API:
- sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)
- feature_range:指定范围,默认0-1
- 即实例化转换器的时候transfer=MinMaxScaler(feature_range=(0,1))也可写成transfer=MinMaxScaler()
- MinMaxScalar.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- return:转换后的形状相同的array
归一化步骤 :
1)实例化MinMaxScalar
2)通过fit_transform转换
实现过程:
网上对归一化的演示普遍采用“约会网站”的案例,这个案例在《机器学习实战》的P20-P28页中有详细讲解,想要深度学习的朋友可以参考,我也通过综合学习实践后,把自己的实现过程以及实验内容写入下文作,案例用到数据集dating.txt,上传资源至博客,可自行下载 处理技巧:右键复制路径再粘贴比较方便: 将数据集打印出来: 运行效果: 核心代码:
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
data=pd.read_csv("./data/dating.txt")
print(data)
transfer=MinMaxScaler(feature_range=(0,1))
minimax_data=transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("经过归一化处理之后的数据为:\n",minimax_data)
**归一化缺点:**在统计出错等情况下,最大最小值容易受异常点影响,比如年龄统计成几百,而归一化的计算过程用到最大值进行变换处理,因此鲁棒性差,只适合传统精确小数据场景,以后不能用这种方式进行归一化,于是出现了改良版,即标准化
2. 标准化
定义:通过对原始数据进行变换把数据变换到均值为0,标准差为1的范围内 公式: 作用于每一列,即对每一列的数据求均值和方差,其中mean为平均值,分母是标准差 **如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小,这改善了归一化带来的问题。**所以回到刚才异常点的地方,再看标准化: API:
- sklearn.preprocessing.StandardScaler( )
- 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
- StandardScaler.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
运行效果: 核心代码:
from sklearn.preprocessing import MinMaxScaler,StandardScaler
import pandas as pd
data=pd.read_csv("./data/dating.txt")
transfer=StandardScaler()
sta_data=transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("经过标准化处理之后的数据为:\n",sta_data)
总结:
- 异常值影响小
- 适合现代嘈杂大数据场景
下一篇更新“实验过程的重要实现”和“实验结束的学习总结”部分,感谢大家的阅读
|