大部分的机器学习模型所处理的都是特征,特征通常是输入变量所对应的可用于模型的数值表示。
大部分情况下,收集得到的数据需要经过处理后才能够为算法所使用。通常情况下,一个数据集当中存在很多种不同的特征,其中一些可能是多余的或者与我们要预测的值无关的,可通过数据处理和可视化进行筛选。
特征选择技术的必要性也体现在简化模型、减少训练时间、避免维度爆炸和提升泛化性避免过拟合。
1.熟悉机器学习之数据处理与可视化方法
2.使用数据处理与可视化方法分析数据特征
1.安装scikit-learn机器学习及其相关的python包;
2.在程序里下载鸢尾花数据集;
3.使用matplotlib对鸢尾花数据集的特征两两对比绘图;
4.对绘出的鸢尾花可视化图分析哪些特征可明显区分出鸢尾花类别;
1.PC机
2.Windows10
3.Scikit-learn安装包
4.jupyter编辑器或pycharm等python编辑器
安装过程略,直接安装scikit-learn模块,可以采用国内镜像安装,比较节省时间。
输入
pip show scikit-learn
检测一下本机环境是否成功安装【scikit-learn】本模块。
我们这里采用load_iris数据集,一共包括150行记录,其中前四列为花萼长度,花萼宽度,花瓣长度,花瓣宽度4个识别鸢尾花的属性,‘sepal_len’,‘sepal_wid’,‘petal_len’,‘petal_wid’。
第5列为鸢尾花的类别(包括Setosa,Versicolour,Virginica三类)
代码如下
1.import matplotlib.pyplot as plt
2.from sklearn.datasets import load_iris
3.iris = load_iris()
4.X = iris.data
5.print(X.shape, X)
因为我们会使用figure方法,我们先定义一下大小,让16个子图可以合适的输出。如下代码:
plt.figure(figsize=(44,44))
我们需要输出16个子图,设置变量为4,遍历俩次。
feature_max_num=4
遍历俩次,如下:
for feature in range(feature_max_num):
for feature_other in range(feature_max_num):
可以想象一下:
分别是 0-0,0-1,0-2,0-3,1-0,1-1……
有16种组合,还需取特征值要用。
我们需要设置一下每个子图的位置,可以依次画出这些子图,优点是简单明了,缺点是略显麻烦。
如下代码:
plt.subplot(feature_max_num,feature_max_num,feature*feature_max_num+feature_other +1,frame_on= True)
我们需要思考一下,如果0-0,1-1,2-2,这种属于特殊情况,我们分别处理一下。
plt.scatter的属性我们需要了解一下:如下
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None,
vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)
if feature==feature_other: #特殊情况
如果,feature==feature_other,遍历值相同的话,x, y → 散点的坐标是相同的,这不是很直观,我们直接把x散点的坐标设置一个自增变量,让它从0到49自增。
plt.scatter([i for i in range(50)],X[0:50,feature],color='green',marker='o',label='setosa')
...
...
其他情况的话:x, y → 散点的坐标是不同,正常进行绘制即可
else:
plt.scatter(X[0:50,feature],X[0:50,feature_other],color='green',marker='o',label='setosa')
...
...
上述代码解释:
X[0:50,feature],X[0:50,feature_other]
分别代表x, y → 散点的坐标,因为上文我们有150组目标数据,我们根据不同的特征值从数据集里获取到我们需要目标数据集。进行绘图处理。
需要了解语法:
a[:,1]的含义,即可看懂。
下面我们需要设置X轴和Y轴的标签。语法如下:
xlabel(xlabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)
plt.xlabel(iris.feature_names[feature])
plt.vlabel(iris.feature_names[feature_other])
最后设置图例位置,输出图像。
plt.legend(loc='best')
plt.show()
根据图0-2 ,1-3层次分明。
可以看出萼片长度和花瓣长度,萼片宽度和花瓣宽度特征可明显区分出鸢尾花类别。
本文涉及到的源码如下,可以直接运行:
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
print(X.shape, X)
plt.figure(figsize=(44,44))
feature_max_num=4
for feature in range(feature_max_num):
for feature_other in range(feature_max_num):
plt.subplot(feature_max_num,feature_max_num,feature*feature_max_num+feature_other +1,frame_on= True)
if feature==feature_other:
plt.scatter([i for i in range(50)],X[0:50,feature],color='green',marker='o',label='setosa')
plt.scatter([i for i in range(50)],X[50:100,feature],color='blue',marker='x',label='versicolor')
plt.scatter([i for i in range(50)],X[100:,feature],color='red',marker='+',label='Virginica')
else:
plt.scatter(X[0:50,feature],X[0:50,feature_other],color='green',marker='o',label='setosa')
plt.scatter(X[50:100,feature],X[50:100,feature_other],color='blue',marker='x',label='versicolor')
plt.scatter(X[100:,feature],X[100:,feature_other],color="red",marker='+',label='Virginica')
plt.xlabel(iris.feature_names[feature])
plt.vlabel(iris.feature_names[feature_other])
plt.legend(loc='best')
plt.show()