如何使用模板建设网站,wordpress连接到微博,dede免费手机网站模板下载,网站字体设计规范一、任务背景 本文是python实战系列专栏的第一篇文章#xff0c;我们将从分类开始由浅入深逐步学习如何使用python完成常规的机器学习/深度学习任务。iris数据集是经典的机器学习入门数据集#xff0c;许多分类任务教程都会以这个数据集作为示例#xff0c;它的数据量是150条…一、任务背景 本文是python实战系列专栏的第一篇文章我们将从分类开始由浅入深逐步学习如何使用python完成常规的机器学习/深度学习任务。iris数据集是经典的机器学习入门数据集许多分类任务教程都会以这个数据集作为示例它的数据量是150条由三种不同品种的鸢尾花数据构成每种鸢尾花各50条数据。显然这是一个多分类三分类任务我们将从头开始进行探索性数据分析及机器学习建模。
二、机器学习建模流程
1、探索性数据分析 探索性数据分析是建模的第一步尤其是机器学习任务。尽管这是一个很标准、很干净的数据集我们还是按照惯例对它进行基础的分析特征列、空值、各列取值范围等以对该数据集有个初步的了解和认知。
1数据集读取 由于iris数据集实在太经典所以很多python库都内置了该数据集的调用代码例如在scikit-learn中可以这样调用
from sklearn import datasets# 加载iris数据集
iris datasets.load_iris()
# 获取特征数据
iris_X iris.data
# 获取目标类别数据
iris_y iris.target 但是实际应用中我们更多的是读取本地文件所以这里笔者从Kaggle下载了iris数据文件并本地读取
# 读取csv文件数据
path ./data/iris.csv
df pd.read_csv(path)
print(数据量, len(df))
print(df.head()) 结果如下可见该数据集总共有150行6列其中一列是Id在我们这次任务中作用不大后面会去掉 根据官方的介绍各列的含义如下
SepalLengthCm花萼长度即花萼的最长部分单位是厘米。SepalWidthCm花萼宽度即花萼的最宽部分单位是厘米。PetalLengthCm花瓣长度即花瓣的最长部分单位是厘米。PetalWidth Cm花瓣宽度即花瓣的最宽部分单位是厘米。 而标签列Species中的类别有
Iris setosa山鸢尾Iris virginica变色鸢尾Iris versicolor维吉尼亚鸢尾
2查看各列中是否有空值 去空值是数据处理阶段的重要步骤存在空值的数据会导致后面的特征工程或者建模报错。下面的代码逐列统计是否有空值
print(空值数量统计)
print(df.isnull().sum()) 结果如下每一列都很干净 3简要统计各列的数据数值分布 统计各列的数据分布主要目的是看看每一列各自以及相互之间的数据差异。如果某一列的数据取值之间非常接近例如一个极端情况是整一列的取值都是1那么可能这一列对于建模来说是没有意义的可以去掉。同时分位数也能帮我们判断当前列数据中是否存在离群点可以考虑去掉离群点。此外如果列和列之间取值范围差得较大比如一列的取值范围是0-1另一列是100-200就需要进行归一化/标准化操作量纲差异太大会导致模型学习过程中对特征重要性的判别出现误差。这里我们选择不对原始数据进行归一化或者标准化一是各列之间的量纲接近二是我们后面用的是决策树模型建模决策树不需要归一化/标准化操作。
print(df.describe()) 4检查标签列是否符合建模要求 从上面的图中我们可以看到标签列是文本类型无法进行建模。因此需要将标签转换成模型可理解的数值类型转为数值类型才可以计算损失。
# 定义各类别对应的索引号
label_index {Iris-setosa:0, Iris-versicolor:1, Iris-virginica:2}
# apply方法应用到标签列中的每一个标签
df[Species] df[Species].apply(lambda x: label_index[x])
2、数据可视化 我们可以使用sklearn提供的PCA降维方法将原始数据降维成2维也可以进行3维可视化并且可视化出来。
# 分出特征列和标签列
X df[[SepalLengthCm, SepalWidthCm, PetalLengthCm, PetalWidthCm]].values.tolist()
y df[Species].tolist()
# 降维
pca PCA(n_components2)
pca_data pca.fit_transform(X)
# 可视化
plt.scatter(pca_data[:, 0], pca_data[:, 1], cy)
plt.show() 可视化结果如下图虽然可视化的过程没有标出来哪个颜色对应哪一类的鸢尾花但我们可以看到某一类鸢尾花很轻易就可以与另外两类区分开来而距离较近的两类似乎数据也是线性可分的那么我们可以考虑用一个简单的模型完成这个任务。 3、数据划分 了解了数据分布之后我们可以开始进行数据的划分了即划分训练集和测试集。其中训练集用于训练模型测试集用于测试模型的效果测试集数据应当是在模型的训练阶段是未出现过的否则就存在模型作弊的问题了。
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, stratifyy, random_state2024)
print(训练集数据量, len(X_train))
print(测试集数据量, len(X_test)) 这里讲一下几个比较重要的参数
stratify控制训练集和测试集的标签类别比例默认是无但是我们一般会根据y进行划分。假如我们有100个数据70个属于A类30个属于B类如果不指定该参数且test_size恰好是0.3那么就有可能出现我们训练集中的70个都是A类数据这样子模型只学了A的数据规律使用测试集的30个数据进行测试的时候效果就很糟糕了。而如果指定了该参数那么算法会确保训练集中各类别的比例和测试集中的各类别比例一致如果算出来的数量不是整数会自动取整假设这个例子我们指定的stratify是y那么训练集中A和B类别的比例和测试集一致都是73则训练集中A类有49个B类有21个测试集中A类有21个B类有9个保持了数据集划分的公平性。test_size指定训练集和测试集划分过程中的比例用0-1开区间之间的小数就可以了。random_state指定随机数以保证模型结果可复现。 打印数据划分结果如下 4、模型训练 这里我们使用一个决策树分类器作为模型使用训练数据迭代训练决策树模型并输出模型的各项性能指标。
dt DecisionTreeClassifier(criteriongini, splitterbest, max_depth5, class_weightbalanced, random_state2024)
dt.fit(X_train, y_train)
y_pred dt.predict(X_test)
# 多分类问题需要指定average其中
# micro计算全局精确度通过将所有类别的真正例和假正例汇总然后计算整体的精确度。
# macro计算未加权平均精确度简单地计算每个类别的精确度然后求平均值不考虑每个类别的样本数量。
# weighted计算加权平均精确度计算每个类别的精确度然后根据每个类别的样本数量进行加权平均。
print(Precision:, precision_score(y_test, y_pred, averagemacro))
print(Recall:, recall_score(y_test, y_pred, averagemacro))
print(F1:, f1_score(y_test, y_pred, averagemacro)) 这里有几个模型参数需要注意
criterion可选的有“gini”、“entropy”、“log_loss”用于指定构建树时用于分裂节点的准则默认是”gini”即基尼不纯度。当使用gini作为参数的值时决策树在每个节点的分裂都旨在最小化基尼不纯度而使用entropy时决策树在每个节点的分裂都旨在最大化信息增益这意味着最小化熵。splitter可选的有“best”、“random”用于指定如何选择分裂节点的方法默认是”best”。当设置为best时决策树会考虑所有可能的特征和所有可能的分割点并选择能够最好地减少criterion取值的最佳分裂点。max_depth指定树的深度默认是不限制也就是树可以无限生长直到满足损失要求但是对于一些模型规模有限制的场景建议限制树的深度在一定范围否则模型可能非常大。class_weight默认为无可以输入字典键为类别值为当前类别的样本数也可以直接写“balanced”。建议直接指定“balanced”这样模型会自动为不同类别的样本赋予权重。这个参数在样本类别不平衡的时候非常重要假设一个二分类任务中样本A有98个B有2个不设置权重模型可能只学A的特征从而忽略B类因为即便B类预测错误总体数据上仍然能够有一个很好的指标结果但设置class_weight后模型会认为A和B同样重要从而避免样本类别不平衡造成的模型问题。random_state指定随机数以便复现模型结果。 以下是训练后的模型在测试集上的表现由于数据集较为简单模型的指标效果不错。当然如果进行更细致的参数调优模型可以取得更好的效果这里就不演示了。 三、完整代码
import pandas as pd
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import precision_score, recall_score, f1_scorepath ./data/iris.csv
df pd.read_csv(path)
print(数据量, len(df))
print(df.head())
print(空值数量统计)
print(df.isnull().sum())
print(df.describe())
df.drop([Id], axis1)
label_index {Iris-setosa:0, Iris-versicolor:1, Iris-virginica:2}
df[Species] df[Species].apply(lambda x: label_index[x])X df[[SepalLengthCm, SepalWidthCm, PetalLengthCm, PetalWidthCm]].values.tolist()
y df[Species].tolist()
pca PCA(n_components2)
pca_data pca.fit_transform(X)
plt.scatter(pca_data[:, 0], pca_data[:, 1], cy)
plt.show()X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, stratifyy, random_state2024)
print(训练集数据量, len(X_train))
print(测试集数据量, len(X_test))
dt DecisionTreeClassifier(criteriongini, splitterbest, max_depth5, class_weightbalanced, random_state2024)
dt.fit(X_train, y_train)
y_pred dt.predict(X_test)
print(Precision:, precision_score(y_test, y_pred, averagemacro))
print(Recall:, recall_score(y_test, y_pred, averagemacro))
print(F1:, f1_score(y_test, y_pred, averagemacro))
四、总结 本文使用决策树模型对iris鸢尾花数据集进行了分类建模由于数据量小、数据集简单且各特征含义明确本文直接使用所有特征进行建模。实际的建模任务中特征选择也是重要的一步我们需要选择对建模真正有用的特征特征选择而不是所有特征都用于建模比如一份数据可能有100多个特征列但实际对建模有用的可能只有5、6个特征。后面的博文将会陆续介绍这些技巧并展示如何在更复杂的生产数据中使用这些技巧进行建模。