看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 在机器学习和建模中也非常重要,经常用于数据观察、数据格式转换以及数据的归一化和标准化。本案例中,我们介绍 pandas 配合 sklearn 使用经典的鸢尾花研究数据来做品种预测。
sklearn 集成了 iris 数据集,它共有 4 个属性列和一个种类列。4 个属性是 sepal length(萼片长度)、sepal width(萼片宽度)、petal length(花瓣长度)和 petal width(花瓣宽度),单位都是厘米。3 个种类是 Setosa、Versicolour 和 Virginica,样本数量为 150 个,每类 50 个。
首先将数据加载到 DataFrame:
import pandas as pd
from sklearn.datasets import load_iris
# 安装:pip install -U scikit-learn -i https://pypi.douban.com/simple
df = pd.DataFrame(load_iris().data,
columns=['萼片长度', '萼片宽度', '花瓣长度', '花瓣宽度'])
# 添加种类列
df = df.assign(种类=load_iris().target)
# 补充种类名称
df = df.assign(种类名称=df['种类'].map({0:'Setosa',
1:'Versicolour',
2:'Virginica'}))
df
'''
萼片长度 萼片宽度 花瓣长度 花瓣宽度 种类 种类名称
0 5.1 3.5 1.4 0.2 0 Setosa
1 4.9 3.0 1.4 0.2 0 Setosa
2 4.7 3.2 1.3 0.2 0 Setosa
3 4.6 3.1 1.5 0.2 0 Setosa
4 5.0 3.6 1.4 0.2 0 Setosa
.. ... ... ... ... .. ...
145 6.7 3.0 5.2 2.3 2 Virginica
146 6.3 2.5 5.0 1.9 2 Virginica
147 6.5 3.0 5.2 2.0 2 Virginica
148 6.2 3.4 5.4 2.3 2 Virginica
149 5.9 3.0 5.1 1.8 2 Virginica
[150 rows x 6 columns]
'''
提取特征值和目标值。特征值就是测量数据,目标值是最终是哪个种类的结论。需要将数据结构转为 array:
# 特征值
x_train = df[['萼片长度', '萼片宽度', '花瓣长度', '花瓣宽度']].to_numpy()
x_train
'''
array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
...
[6.2, 3.4, 5.4, 2.3],
[5.9, 3. , 5.1, 1.8]])
'''
# 目标值
y_train = df['种类'].to_numpy()
y_train
'''
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
'''
切分数据集,将原数据分为两份,大部分用来做机器学习,剩余的小部分不参与机器学习,用于机器学习模型建立后的验证工作。将数据集随机划分成训练集和测试集,返回训练集特征值、测试集特征值、训练集目标值和测试集目标值:
# 导入函数
from sklearn.model_selection import train_test_split
# 切分数据集
x_train, x_test, y_train, y_test = train_test_split(x_train,y_train)
# 建立模型
from sklearn.linear_model import LogisticRegression
# 逻辑回归分类模型,可设置迭代次数 max_iter=3000
lgr = LogisticRegression(max_iter=3000)
# 训练数据
lgr.fit(x_train, y_train)
# LogisticRegression(max_iter=3000)
lgr 就是我们建立的机器学习模型,可以用来进行数据预测。接下来我们验证一下这个模型的效果:
# 测试结果
lgr.predict(x_test)
# array([1, 0, 2, 0])
# 实际
y_test
# array([1, 0, 2, 0])
# 有多少准确的和不准确的
pd.Series((lgr.predict(x_test) == y_test)).value_counts(normalize=True)
'''
True 1.0
dtype: float64
'''
# 单个预测,目测准确
lgr.predict([[5.1,3.5,5.4,2.1]])
# array([2])
# 训练集上的准确度评分
lgr.score(x_train,y_train)
# 0.9733333333333334
# 测试集上的准确度评分
lgr.score(x_test,y_test)
# 1.0
最后看一下在原数据上的预测效果:
# 全局验证模型准确性
(
df.assign(预测种类=lgr.predict(df.loc[:,'萼片长度':'花瓣宽度'].to_numpy()))
.assign(是否正确=lambda x: x['种类']==x.预测种类)
.是否正确
.value_counts(normalize=True)
)
'''
True 0.973333
False 0.026667
Name: 是否正确, dtype: float64
'''
正确率达到 97.3% !至此,本例用最简单的模型展示了机器学习的过程。大家可以通过更加合理的数据特征工程,尝试使用其他算法对数据进行训练,以达到更佳的效果。
(完)
注:此案例收录在《深入浅出Pandas:利用Python进行数据处理与分析》17.3.8 小节。
更新时间:Aug. 18, 2024, 4:14 p.m. 标签:pandas python 缺失值