Python实现机器学习算法的分类
作者:白衫岁寒如水 发布时间:2023-08-31 05:50:36
标签:Python,算法,机器学习
Python算法的分类
对葡萄酒数据集进行测试,由于数据集是多分类且数据的样本分布不平衡,所以直接对数据测试,效果不理想。所以使用SMOTE过采样对数据进行处理,对数据去重,去空,处理后数据达到均衡,然后进行测试,与之前测试相比,准确率提升较高。
例如:决策树:
Smote处理前:
Smote处理后:
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))
来源:https://blog.csdn.net/qq_41934789/article/details/117400996
0
投稿
猜你喜欢
- CSS Sprites 简介:通常被意译为“CSS图像拼合”或“CSS贴图定位”。CSS Sprites并不是一门新技术,目前它已经在网页开
- 这篇文章主要介绍了python3 tcp的粘包现象和解决办法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 无论哪种编程语言,时间肯定都是非常重要的部分,今天来看一下python如何来处理时间和python定时任务,注意咯:本篇所讲是python3
- Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升
- 很多人都有研究闭合浮动元素的问题,但是解决方法却不一样,也并不是每一种方法都尽善尽美。闭合浮动元素(或者叫清除浮动)是web标准设计中经常会
- 如果想让字典的VALUE成为字典,只有最开始让其成为列表,如下面程序中的b>>> b={}>>> b={
- 最近帮人做了个贪吃蛇的游戏(交作业用),很简单,界面如下:开始界面:游戏中界面:是不是很简单、朴素。(欢迎大家访问GitHub)游戏是基于P
- 第一次用Python写这种比较实用且好玩的东西,权当练手吧游戏说明:* P键控制“暂停/开始”* 方向键控制贪吃蛇的方向源代码如下:from
- 首先,你需要去有道翻译API官网去申请key:http://fanyi.youdao.com/openapi?path=data-mode得
- 文件的存储方式在计算机中,文件是以 二进制的方式保存在磁盘上的文本文件和二进制文件文本文件可以使用文本编辑软件查看本质上还是二进制文件二进制
- 本文实例讲述了Python定时执行之Timer用法。分享给大家供大家参考。具体分析如下:java中Timer的作用亦是如此。python中的
- 前言:集合这种数据类型和我们数学中所学的集合很是相似,数学中堆积和的操作也有交集,并集和差集操作,python集合也是一样。一、交集操作1.
- 若你使用过 Shell 中的 awk 工具,会发现用它来分割字符串是非常方便的。特别是多个连续空格会被当做一个处理。[root@localh
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它
- 后台收到一个读者需求人事部门有最近3年每个月全公司的工资Excel文件,一共500多个。现在和1位员工有一件劳动纠纷,需要把这1位员工散落在
- 之前使用beego的http库的时候,有的情况需要下载文件。beego是能实现,但就是有点问题:不支持回调,没法显示下载速度,这在日常开发中
- 一般情况下,导出超时可能都是以下三种情况:一、sql语句复杂,查询时间过长;二、处理查询后数据逻辑冗余;三、数据量过大导致响应超时。接下来分
- 本次爬虫思路最最重要的是分析信息接口!!!1. 获取url2. 通过请求拿到响应3. 处理反爬4. 提取信息5. 保存内容本次操练网页htt
- 被AJAX中DOM的操作郁闷了好几天,今天总算搞明白了,自学就是苦啊,苦的一把鼻涕一把泪的,把教训些出来,给后来者提个醒,老鸟就不要看了。下
- 测试数据 http://grouplens.org/datasets/movielens/协同过滤推荐算法主要分为:1、基于用户。根据相邻用