本文源自MOOC南京大学《用Python玩转数据》张莉老师讲解,如有侵权会及时删除。
在老师的讲解上加入了更多的注释,希望方便大家理解。
首先附上数据集
数据集:http://archive.ics.uci.edu/ml/datasets/Wine+Quality
下面开始放代码
- 首先调用库
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
import warnings
warnings.filterwarnings('ignore')
- 导入数据
try:
wine = pd.read_csv('C:/Users/Desktop/winequality-red.csv',sep = ';')
except:
print('cannot find the file')#导入数据完毕
这里说明一点,如果数据集放在.spyder-py3文件夹下就可以直接调用,否则的话,需要写路径。如上,我就是写出了文件存放路径,可以通过右键文件查找路径。
下面看数据的基本情况,由于本数据集没有缺失值所以没有处理,但是查看了数据集的重复值并进行了删除。
print(wine.info())#看数据的基本情况,一共有1599条非空数据,有12个属性
print(wine.duplicated())#检查是否有重复记录,有的话是True,没有是False
print(wine.duplicated().sum())#sum显示有多少条重复记录
wine = wine.drop_duplicates()#删除重复记录
print(wine)
数据基本情况,一共有1599条非空数据,有12个属性
![](https://img.haomeiwen.com/i10776227/d65886c67655f2be.png)
检查是否有重复记录,有的话是True,没有是False
![](https://img.haomeiwen.com/i10776227/8c656d3b606f3700.png)
- 看数据的基本属性值
print(wine.describe())#看数据的基本属性
print(wine.quality.value_counts())#qulity属性具体每一类有多少个值,可以看出符合正态分布
![](https://img.haomeiwen.com/i10776227/13c1cb36f1a6b3f8.png)
5.做饼状图
wine.quality.value_counts().plot(kind = 'pie', autopct = '%.2f')#绘制饼图
plt.show()
![](https://img.haomeiwen.com/i10776227/9d621d0f34684b82.png)
- 看quality与其他属性的相关性
print(wine.corr().quality)#检查quality与其他属性的皮尔逊相关指数
plt.subplot(121)#将区域划分为一行两列,选择左边区域
sns.barplot(x = 'quality', y = 'volatile acidity', data = wine)#每一个quality对应的volatile acidity的均值分布
plt.subplot(122)#将区域划分为一行两列,选择右边区域
sns.barplot(x = 'quality', y = 'alcohol', data = wine)#比如棕色的,quality值为8,对应的alcohol的均值。alcohol越高,quality越高
plt.show()
可以看出volatile acidity和alcohol的指数接近0.5,是相对较高的
![](https://img.haomeiwen.com/i10776227/053ef6990083a6a7.png)
进行可视化,可以看出alcogol越高,quality越高;volarile acidity越低,quality越高。
![](https://img.haomeiwen.com/i10776227/1f1158bb5b02f9ad.png)
from sklearn.preprocessing import LabelEncoder
bins = (2,4,6,8)#bins构成左开右闭区间(2,4】,(4,6】,(6,8】,将quality分为三类
group_names = ('low','medium','high')#对三组建立组名
wine['quality_lb'] = pd.cut(wine['quality'],bins = bins, labels = group_names)#使用cut划分数据
print(wine)
lb_quality = LabelEncoder()
wine['label'] = lb_quality.fit_transform(wine['quality_lb'])
print(wine)#将quality等级分为0,1,2;增加了一个新列
df = wine
print(df.head(20))#通过展示前20行,我们可以看到1表示low,2表示medium,0表示high
print(wine.label.value_counts())#统计新类别的分类
wine_copy = wine.copy()
wine.drop(['quality','quality_lb'], axis = 1, inplace = True)#处理成11个特征属性和label列
x = wine.iloc[:,:11]#逗号左边表示行数,此处显示全部行数;逗号右边表示列数,此处表示11列,也可以写成:-1 11个都为特征属性,存入x
y = wine.label#label为目标属性,存入y
print(x,y)
from sklearn.model_selection import train_test_split#要将数据集划分为测试集和训练集
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size = 0.2)#随机选取比例,80%作为训练集,20%作为测试集
添加了quality_lb 和 label
![](https://img.haomeiwen.com/i10776227/2c5406701b49b430.png)
展示前20行,注明,第4、11行缺失是由于是重复值,因此删除了
![](https://img.haomeiwen.com/i10776227/99b0392658a9f30f.png)
每个等级的数据数
![](https://img.haomeiwen.com/i10776227/f7485a84eda74cf1.png)
from sklearn.preprocessing import scale#对训练集和测试集都进行标准化处理
x_train = scale(x_train)
x_test = scale(x_test)
from sklearn.metrics import confusion_matrix
rfc = RandomForestClassifier(n_estimators = 200)#使用随机森林函数构建一个分类器,利用最大投票数或者均值来预测前,想要建立子树的数量多的数量会有更好的效果,代码会变慢
rfc.fit(x_train, y_train)#使用fit进行训练
y_pred = rfc.predict(x_test)#使用predict进行预测
print(confusion_matrix(y_test,y_pred))#将实际y值与预测结果比较,判断模型预测效果,使用混淆矩阵
![](https://img.haomeiwen.com/i10776227/31def821e27a7dfb.png)
对混淆矩阵做说明
![](https://img.haomeiwen.com/i10776227/5526f6796b90f4e3.png)
混淆矩阵每一列代表预测值,每一行代表实际的类别。对角线上的个数就是正确判断出类别的数据记录个数,其他位置是类别误判的个数,对角线上的占比越大表示分类效果越好。
15表示类别0判断正确的个数,总的类别0的个数是15+25
25表示本来应该是类别0的个数,误判成了类别2
类别2的精度最高,217个正确,只有6个被误判成了类别0
- 参数,GridSearchCV是暴力搜索,把参数输入进去,就能给出最优化的结果,适合于小数据集
param_rfc = {
"n_estimators":[10,20,30,40,50,60,70,80,90,100,150,200],#选取的参数
"criterion":["gini","entropy"]
}
grid_rfc = GridSearchCV(rfc, param_rfc, iid = False, cv = 5)
grid_rfc.fit(x_train, y_train)
best_param_rfc = grid_rfc.best_params_
print(best_param_rfc)#保存的是已经取得最佳结果的参数组合
- 重新预测
#重新预测
rfc = RandomForestClassifier(n_estimators = best_param_rfc['n_estimators'], criterion = best_param_rfc['criterion'],random_state=0)
rfc.fit(x_train, y_train)
y_pred = rfc.predict(x_test)
print(confusion_matrix(y_test,y_pred))
得到矩阵
![](https://img.haomeiwen.com/i10776227/0b15758f72508b62.png)
以上是老师讲解的全部代码,本人也是初学者,后面的随机森林模型还有很多需要学习的地方,希望可以跟大家一起交流。
网友评论