看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注: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 小节。
更新时间:2024-08-18 16:14:15 标签:pandas python 缺失值