美文网首页
基于随机森林模型的红酒品质分析

基于随机森林模型的红酒品质分析

作者: L咯咯哒 | 来源:发表于2020-07-03 21:18 被阅读0次

    本文源自MOOC南京大学《用Python玩转数据》张莉老师讲解,如有侵权会及时删除。
    在老师的讲解上加入了更多的注释,希望方便大家理解。
    首先附上数据集
    数据集:http://archive.ics.uci.edu/ml/datasets/Wine+Quality

    下面开始放代码

    1. 首先调用库
    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')
    
    1. 导入数据
    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个属性


    image.png

    检查是否有重复记录,有的话是True,没有是False


    image.png
    1. 看数据的基本属性值
    print(wine.describe())#看数据的基本属性
    print(wine.quality.value_counts())#qulity属性具体每一类有多少个值,可以看出符合正态分布
    
    image.png

    5.做饼状图

    wine.quality.value_counts().plot(kind = 'pie', autopct = '%.2f')#绘制饼图
    plt.show()
    
    1. 看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,是相对较高的


    image.png

    进行可视化,可以看出alcogol越高,quality越高;volarile acidity越低,quality越高。


    image.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


    image.png

    展示前20行,注明,第4、11行缺失是由于是重复值,因此删除了


    image.png
    每个等级的数据数
    image.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值与预测结果比较,判断模型预测效果,使用混淆矩阵
    
    image.png

    对混淆矩阵做说明



    混淆矩阵每一列代表预测值,每一行代表实际的类别。对角线上的个数就是正确判断出类别的数据记录个数,其他位置是类别误判的个数,对角线上的占比越大表示分类效果越好。
    15表示类别0判断正确的个数,总的类别0的个数是15+25
    25表示本来应该是类别0的个数,误判成了类别2
    类别2的精度最高,217个正确,只有6个被误判成了类别0

    1. 参数,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)#保存的是已经取得最佳结果的参数组合
    
    1. 重新预测
    #重新预测
    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))
    

    得到矩阵


    image.png

    以上是老师讲解的全部代码,本人也是初学者,后面的随机森林模型还有很多需要学习的地方,希望可以跟大家一起交流。

    相关文章

      网友评论

          本文标题:基于随机森林模型的红酒品质分析

          本文链接:https://www.haomeiwen.com/subject/jyeeqktx.html