Python实现机器学习算法的分类


Posted in Python onJune 03, 2021

Python算法的分类

对葡萄酒数据集进行测试,由于数据集是多分类且数据的样本分布不平衡,所以直接对数据测试,效果不理想。所以使用SMOTE过采样对数据进行处理,对数据去重,去空,处理后数据达到均衡,然后进行测试,与之前测试相比,准确率提升较高。

Python实现机器学习算法的分类

例如:决策树:

Smote处理前:

Python实现机器学习算法的分类

Smote处理后:

Python实现机器学习算法的分类

from typing import Counter
from matplotlib import colors, markers
import numpy as np
import pandas as pd
import operator
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.svm import SVC
# 判断模型预测准确率的模型
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_auc_score
from sklearn.metrics import f1_score
from sklearn.metrics import classification_report

#设置绘图内的文字
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']


path ="C:\\Users\\zt\\Desktop\\winequality\\myexcel.xls"
# path=r"C:\\Users\\zt\\Desktop\\winequality\\winequality-red.csv"#您要读取的文件路径
# exceldata = np.loadtxt(
#     path,
#     dtype=str,
#     delimiter=";",#每列数据的隔开标志
#     skiprows=1
# )

# print(Counter(exceldata[:,-1]))

exceldata = pd.read_excel(path)
print(exceldata)

print(exceldata[exceldata.duplicated()])
print(exceldata.duplicated().sum())

#去重
exceldata = exceldata.drop_duplicates()


#判空去空
print(exceldata.isnull())
print(exceldata.isnull().sum)
print(exceldata[~exceldata.isnull()])
exceldata = exceldata[~exceldata.isnull()]

print(Counter(exceldata["quality"]))

#smote

#使用imlbearn库中上采样方法中的SMOTE接口
from imblearn.over_sampling import SMOTE
#定义SMOTE模型,random_state相当于随机数种子的作用


X,y = np.split(exceldata,(11,),axis=1)
smo = SMOTE(random_state=10) 

x_smo,y_smo = SMOTE().fit_resample(X.values,y.values)




print(Counter(y_smo))



x_smo = pd.DataFrame({"fixed acidity":x_smo[:,0], "volatile acidity":x_smo[:,1],"citric acid":x_smo[:,2] ,"residual sugar":x_smo[:,3] ,"chlorides":x_smo[:,4],"free sulfur dioxide":x_smo[:,5] ,"total sulfur dioxide":x_smo[:,6] ,"density":x_smo[:,7],"pH":x_smo[:,8] ,"sulphates":x_smo[:,9] ," alcohol":x_smo[:,10]})
y_smo = pd.DataFrame({"quality":y_smo})
print(x_smo.shape)
print(y_smo.shape)
#合并
exceldata = pd.concat([x_smo,y_smo],axis=1)
print(exceldata)

#分割X,y
X,y = np.split(exceldata,(11,),axis=1)
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=10,train_size=0.7)
print("训练集大小:%d"%(X_train.shape[0]))
print("测试集大小:%d"%(X_test.shape[0]))



def func_mlp(X_train,X_test,y_train,y_test):
    print("神经网络MLP:")
    kk = [i for i in range(200,500,50) ] #迭代次数
    t_precision = []
    t_recall = []
    t_accuracy = []
    t_f1_score = []
    for n in kk:
        method = MLPClassifier(activation="tanh",solver='lbfgs', alpha=1e-5,
                    hidden_layer_sizes=(5, 2), random_state=1,max_iter=n)
        method.fit(X_train,y_train)
        MLPClassifier(activation='relu', alpha=1e-05, batch_size='auto', beta_1=0.9,
                        beta_2=0.999, early_stopping=False, epsilon=1e-08,
                        hidden_layer_sizes=(5, 2), learning_rate='constant',
                        learning_rate_init=0.001, max_iter=n, momentum=0.9,
                        nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
                        solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
                        warm_start=False)
        y_predict = method.predict(X_test)
        t =classification_report(y_test, y_predict, target_names=['3','4','5','6','7','8'],output_dict=True)
        print(t)
        t_accuracy.append(t["accuracy"])
        t_precision.append(t["weighted avg"]["precision"])
        t_recall.append(t["weighted avg"]["recall"])
        t_f1_score.append(t["weighted avg"]["f1-score"])
    plt.figure("数据未处理MLP")
    plt.subplot(2,2,1)
    #添加文本 #x轴文本
    plt.xlabel('迭代次数')
    #y轴文本
    plt.ylabel('accuracy')
    #标题
    plt.title('不同迭代次数下的accuracy')
    plt.plot(kk,t_accuracy,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,2)
    #添加文本 #x轴文本
    plt.xlabel('迭代次数')
    #y轴文本
    plt.ylabel('precision')
    #标题
    plt.title('不同迭代次数下的precision')
    plt.plot(kk,t_precision,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,3)
    #添加文本 #x轴文本
    plt.xlabel('迭代次数')
    #y轴文本
    plt.ylabel('recall')
    #标题
    plt.title('不同迭代次数下的recall')
    plt.plot(kk,t_recall,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,4)
    #添加文本 #x轴文本
    plt.xlabel('迭代次数')
    #y轴文本
    plt.ylabel('f1_score')
    #标题
    plt.title('不同迭代次数下的f1_score')
    plt.plot(kk,t_f1_score,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.show()


def func_svc(X_train,X_test,y_train,y_test):
    print("向量机:")
    kk = ["linear","poly","rbf"] #核函数类型
    t_precision = []
    t_recall = []
    t_accuracy = []
    t_f1_score = []
    for n in kk:
        method = SVC(kernel=n, random_state=0)
        method = method.fit(X_train, y_train)
        y_predic = method.predict(X_test)
        t =classification_report(y_test, y_predic, target_names=['3','4','5','6','7','8'],output_dict=True)
        print(t)
        t_accuracy.append(t["accuracy"])
        t_precision.append(t["weighted avg"]["precision"])
        t_recall.append(t["weighted avg"]["recall"])
        t_f1_score.append(t["weighted avg"]["f1-score"])
    plt.figure("数据未处理向量机")
    plt.subplot(2,2,1)
    #添加文本 #x轴文本
    plt.xlabel('核函数类型')
    #y轴文本
    plt.ylabel('accuracy')
    #标题
    plt.title('不同核函数类型下的accuracy')
    plt.plot(kk,t_accuracy,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,2)
    #添加文本 #x轴文本
    plt.xlabel('核函数类型')
    #y轴文本
    plt.ylabel('precision')
    #标题
    plt.title('不同核函数类型下的precision')
    plt.plot(kk,t_precision,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,3)
    #添加文本 #x轴文本
    plt.xlabel('核函数类型')
    #y轴文本
    plt.ylabel('recall')
    #标题
    plt.title('不同核函数类型下的recall')
    plt.plot(kk,t_recall,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,4)
    #添加文本 #x轴文本
    plt.xlabel('核函数类型')
    #y轴文本
    plt.ylabel('f1_score')
    #标题
    plt.title('不同核函数类型下的f1_score')
    plt.plot(kk,t_f1_score,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.show()

def func_classtree(X_train,X_test,y_train,y_test):
    print("决策树:")
    kk = [10,20,30,40,50,60,70,80,90,100] #决策树最大深度
    t_precision = []
    t_recall = []
    t_accuracy = []
    t_f1_score = []
    for n in kk:
        method = tree.DecisionTreeClassifier(criterion="gini",max_depth=n)
        method.fit(X_train,y_train)
        predic = method.predict(X_test)
        print("method.predict:%f"%method.score(X_test,y_test))

        
        t =classification_report(y_test, predic, target_names=['3','4','5','6','7','8'],output_dict=True)
        print(t)
        t_accuracy.append(t["accuracy"])
        t_precision.append(t["weighted avg"]["precision"])
        t_recall.append(t["weighted avg"]["recall"])
        t_f1_score.append(t["weighted avg"]["f1-score"])
    plt.figure("数据未处理决策树")
    plt.subplot(2,2,1)
    #添加文本 #x轴文本
    plt.xlabel('决策树最大深度')
    #y轴文本
    plt.ylabel('accuracy')
    #标题
    plt.title('不同决策树最大深度下的accuracy')
    plt.plot(kk,t_accuracy,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,2)
    #添加文本 #x轴文本
    plt.xlabel('决策树最大深度')
    #y轴文本
    plt.ylabel('precision')
    #标题
    plt.title('不同决策树最大深度下的precision')
    plt.plot(kk,t_precision,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,3)
    #添加文本 #x轴文本
    plt.xlabel('决策树最大深度')
    #y轴文本
    plt.ylabel('recall')
    #标题
    plt.title('不同决策树最大深度下的recall')
    plt.plot(kk,t_recall,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,4)
    #添加文本 #x轴文本
    plt.xlabel('决策树最大深度')
    #y轴文本
    plt.ylabel('f1_score')
    #标题
    plt.title('不同决策树最大深度下的f1_score')
    plt.plot(kk,t_f1_score,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.show()

def func_adaboost(X_train,X_test,y_train,y_test):
    print("提升树:")
    kk = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8]
    t_precision = []
    t_recall = []
    t_accuracy = []
    t_f1_score = []
    for n in range(100,200,200):
        for k in kk:
            print("迭代次数为:%d\n学习率:%.2f"%(n,k))
            bdt = AdaBoostClassifier(tree.DecisionTreeClassifier(max_depth=2, min_samples_split=20),
                                    algorithm="SAMME",
                                    n_estimators=n, learning_rate=k)
            bdt.fit(X_train, y_train)
            #迭代100次 ,学习率为0.1
            y_pred = bdt.predict(X_test)
            print("训练集score:%lf"%(bdt.score(X_train,y_train)))
            print("测试集score:%lf"%(bdt.score(X_test,y_test)))
            print(bdt.feature_importances_)

            t =classification_report(y_test, y_pred, target_names=['3','4','5','6','7','8'],output_dict=True)
            print(t)
            t_accuracy.append(t["accuracy"])
            t_precision.append(t["weighted avg"]["precision"])
            t_recall.append(t["weighted avg"]["recall"])
            t_f1_score.append(t["weighted avg"]["f1-score"])
    plt.figure("数据未处理迭代100次(adaboost)")
    plt.subplot(2,2,1)
    #添加文本 #x轴文本
    plt.xlabel('学习率')
    #y轴文本
    plt.ylabel('accuracy')
    #标题
    plt.title('不同学习率下的accuracy')
    plt.plot(kk,t_accuracy,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,2)
    #添加文本 #x轴文本
    plt.xlabel('学习率')
    #y轴文本
    plt.ylabel('precision')
    #标题
    plt.title('不同学习率下的precision')
    plt.plot(kk,t_precision,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,3)
    #添加文本 #x轴文本
    plt.xlabel('学习率')
    #y轴文本
    plt.ylabel('recall')
    #标题
    plt.title('不同学习率下的recall')
    plt.plot(kk,t_recall,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,4)
    #添加文本 #x轴文本
    plt.xlabel('学习率')
    #y轴文本
    plt.ylabel('f1_score')
    #标题
    plt.title('不同学习率下的f1_score')
    plt.plot(kk,t_f1_score,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.show()


# inX 用于分类的输入向量
# dataSet表示训练样本集
# 标签向量为labels,标签向量的元素数目和矩阵dataSet的行数相同
# 参数k表示选择最近邻居的数目
def classify0(inx, data_set, labels, k):
    """实现k近邻"""
    data_set_size = data_set.shape[0]   # 数据集个数,即行数
    diff_mat = np.tile(inx, (data_set_size, 1)) - data_set   # 各个属性特征做差
    sq_diff_mat = diff_mat**2  # 各个差值求平方
    sq_distances = sq_diff_mat.sum(axis=1)  # 按行求和
    distances = sq_distances**0.5   # 开方
    sorted_dist_indicies = distances.argsort()  # 按照从小到大排序,并输出相应的索引值
    class_count = {}  # 创建一个字典,存储k个距离中的不同标签的数量

    for i in range(k):
        vote_label = labels[sorted_dist_indicies[i]]  # 求出第i个标签

        # 访问字典中值为vote_label标签的数值再加1,
        #class_count.get(vote_label, 0)中的0表示当为查询到vote_label时的默认值
        class_count[vote_label[0]] = class_count.get(vote_label[0], 0) + 1
    # 将获取的k个近邻的标签类进行排序
    sorted_class_count = sorted(class_count.items(), 
    key=operator.itemgetter(1), reverse=True)
    # 标签类最多的就是未知数据的类
    return sorted_class_count[0][0]

def func_knn(X_train,X_test,y_train,y_test):
    print("k近邻:")
    kk = [i for i in range(3,30,5)] #k的取值
    t_precision = []
    t_recall = []
    t_accuracy = []
    t_f1_score = []
    for n in kk:
        y_predict = []
        for x in X_test.values:
            a = classify0(x, X_train.values, y_train.values, n)  # 调用k近邻分类
            y_predict.append(a)

        t =classification_report(y_test, y_predict, target_names=['3','4','5','6','7','8'],output_dict=True)
        print(t)
        t_accuracy.append(t["accuracy"])
        t_precision.append(t["weighted avg"]["precision"])
        t_recall.append(t["weighted avg"]["recall"])
        t_f1_score.append(t["weighted avg"]["f1-score"])
    plt.figure("数据未处理k近邻")
    plt.subplot(2,2,1)
    #添加文本 #x轴文本
    plt.xlabel('k值')
    #y轴文本
    plt.ylabel('accuracy')
    #标题
    plt.title('不同k值下的accuracy')
    plt.plot(kk,t_accuracy,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))
    
    plt.subplot(2,2,2)
    #添加文本 #x轴文本
    plt.xlabel('k值')
    #y轴文本
    plt.ylabel('precision')
    #标题
    plt.title('不同k值下的precision')
    plt.plot(kk,t_precision,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,3)
    #添加文本 #x轴文本
    plt.xlabel('k值')
    #y轴文本
    plt.ylabel('recall')
    #标题
    plt.title('不同k值下的recall')
    plt.plot(kk,t_recall,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,4)
    #添加文本 #x轴文本
    plt.xlabel('k值')
    #y轴文本
    plt.ylabel('f1_score')
    #标题
    plt.title('不同k值下的f1_score')
    plt.plot(kk,t_f1_score,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.show()

def func_randomforest(X_train,X_test,y_train,y_test):
    print("随机森林:")
    t_precision = []
    t_recall = []
    t_accuracy = []
    t_f1_score = []
    kk = [10,20,30,40,50,60,70,80] #默认树的数量
    for n in kk:
        clf = RandomForestClassifier(n_estimators=n, max_depth=100,min_samples_split=2, random_state=10,verbose=True)
        clf.fit(X_train,y_train)
        predic = clf.predict(X_test)

        print("特征重要性:",clf.feature_importances_)
        print("acc:",clf.score(X_test,y_test))

        t =classification_report(y_test, predic, target_names=['3','4','5','6','7','8'],output_dict=True)
        print(t)
        t_accuracy.append(t["accuracy"])
        t_precision.append(t["weighted avg"]["precision"])
        t_recall.append(t["weighted avg"]["recall"])
        t_f1_score.append(t["weighted avg"]["f1-score"])
    plt.figure("数据未处理深度100(随机森林)")
    plt.subplot(2,2,1)
    #添加文本 #x轴文本
    plt.xlabel('树的数量')
    #y轴文本
    plt.ylabel('accuracy')
    #标题
    plt.title('不同树的数量下的accuracy')
    plt.plot(kk,t_accuracy,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))
    
    plt.subplot(2,2,2)
    #添加文本 #x轴文本
    plt.xlabel('树的数量')
    #y轴文本
    plt.ylabel('precision')
    #标题
    plt.title('不同树的数量下的precision')
    plt.plot(kk,t_precision,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,3)
    #添加文本 #x轴文本
    plt.xlabel('树的数量')
    #y轴文本
    plt.ylabel('recall')
    #标题
    plt.title('不同树的数量下的recall')
    plt.plot(kk,t_recall,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.subplot(2,2,4)
    #添加文本 #x轴文本
    plt.xlabel('树的数量')
    #y轴文本
    plt.ylabel('f1_score')
    #标题
    plt.title('不同树的数量下的f1_score')
    plt.plot(kk,t_f1_score,color="r",marker="o",lineStyle="-")
    plt.yticks(np.arange(0,1,0.1))

    plt.show()






if __name__ == '__main__':
    #神经网络
    print(func_mlp(X_train,X_test,y_train,y_test))
    #向量机
    print(func_svc(X_train,X_test,y_train,y_test))
    #决策树
    print(func_classtree(X_train,X_test,y_train,y_test))
    #提升树
    print(func_adaboost(X_train,X_test,y_train,y_test))
    #knn
    print(func_knn(X_train,X_test,y_train,y_test))
    #randomforest
    print(func_randomforest(X_train,X_test,y_train,y_test))

 

到此这篇关于Python实现机器学习算法的分类的文章就介绍到这了,更多相关Python算法分类内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
教你如何在Django 1.6中正确使用 Signal
Jun 22 Python
python入门教程之识别验证码
Mar 04 Python
python构建自定义回调函数详解
Jun 20 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
Jul 06 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
Django框架的使用教程路由请求响应的方法
Jul 03 Python
对Python2与Python3中__bool__方法的差异详解
Nov 01 Python
pandas 透视表中文字段排序方法
Nov 16 Python
python3使用GUI统计代码量
Sep 18 Python
sklearn的predict_proba使用说明
Jun 28 Python
Python request中文乱码问题解决方案
Sep 17 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Python数据可视化之用Matplotlib绘制常用图形
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 #Python
详解Python生成器和基于生成器的协程
实例讲解Python中sys.argv[]的用法
Jun 03 #Python
Django与数据库交互的实现
Jun 03 #Python
Python代码风格与编程习惯重要吗?
Jun 03 #Python
You might like
php 多个变量指向同一个引用($b = &$a)用法分析
2019/11/13 PHP
jquery实现网页查找功能示例分享
2014/02/12 Javascript
jquery.form.js用法之清空form的方法
2014/03/07 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
Django中URL的参数传递的实现
2019/08/04 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
Python使用Matlab命令过程解析
2020/06/04 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
后勤主管工作职责
2013/12/07 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
学校出纳员岗位职责
2014/03/18 职场文书
三爱活动实施方案
2014/03/19 职场文书
小学生综合素质评语
2014/04/23 职场文书
在职证明书模板
2015/06/15 职场文书
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP