ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

基于SVM算法预测澳大利亚是否降雨,绘制混淆矩阵及ROC曲线

2021-12-02 17:02:29  阅读:210  来源: 互联网

标签:loc SVM Rainfall ROC 矩阵 Ytrain Xtrain import sklearn


基于SVM算法预测澳大利亚是否降雨,绘制混淆矩阵及ROC曲线

代码

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.impute import SimpleImputer as Sim
from sklearn.preprocessing import OrdinalEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import roc_auc_score, recall_score, plot_roc_curve, confusion_matrix

'''获取数据'''
weather = pd.read_csv(r'weatherAUS5000.csv', index_col=0) # dataframe结构,index_col表示哪一列作为行索引
X = weather.iloc[:,:-1] # 获取样本
Y = weather.iloc[:,-1] # 获取标签
X.info() # 获取特征信息,查看空缺情况、数据类型
Y.isnull().sum() #获取标签缺失数量

# 划分训练集和数据集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y, test_size=0.3, random_state=420) # test_size表示测试集所占比例

'''编码标签'''
encoder = LabelEncoder().fit(Ytrain) # 训练编码器
Ytrain = pd.DataFrame(encoder.transform(Ytrain))
Ytest = pd.DataFrame(encoder.transform(Ytest))

'''处理Rainfall数据列'''
Xtrain['Rainfall'].isnull().sum() # 获取缺失值数量
Xtrain.loc[Xtrain.loc[:,'Rainfall']>=1, 'Raintoday'] = 'Yes' # 大于等于1赋值为下雨
Xtrain.loc[Xtrain.loc[:,'Rainfall']<1, 'Raintoday'] = 'No' # 小于1赋值为不下雨
Xtrain.loc[Xtrain.loc[:,'Rainfall'] == np.nan, 'Raintoday'] = np.nan

# 测试集执行相同操作
Xtest.loc[Xtest.loc[:,'Rainfall']>=1, 'Raintoday'] = 'Yes'
Xtest.loc[Xtest.loc[:,'Rainfall']<1, 'Raintoday'] = 'No'
Xtest.loc[Xtest.loc[:,'Rainfall'] == np.nan, 'Raintoday'] = np.nan

'''简化处理,删除无关数据列Date,Location,Rainfall '''
Xtrain = Xtrain.drop(columns=['Date','Location','Rainfall'])
Xtest = Xtest.drop(columns=['Date','Location','Rainfall'])

'''填补分类型数据'''
cate = Xtrain.columns[Xtrain.dtypes == 'object'].tolist() # 寻找那些列是分类型特征
cate = cate + ['Cloud9am','Cloud3pm'] # Cloud9am,Cloud3pm虽为数字,本质上仍为分类型特征

# 对于分类型特征,利用众数填充缺失值
s1 = Sim(missing_values=np.nan, strategy='most_frequent')
s1.fit(Xtrain.loc[:,cate]) # 训练
Xtrain.loc[:,cate] = s1.transform(Xtrain.loc[:,cate]) # transform
Xtest.loc[:,cate] = s1.transform(Xtest.loc[:,cate])

# 将分类型变量编码为数字
oe = OrdinalEncoder()
oe = oe.fit(Xtrain.loc[:,cate])
Xtrain.loc[:,cate] = oe.transform(Xtrain.loc[:,cate])
Xtest.loc[:,cate] = oe.transform(Xtest.loc[:,cate])

'''填补连续型数据'''
# 寻找连续型变量
col = Xtrain.columns.tolist()
for i in cate: # 删除分类型变量即为连续型变量
    col.remove(i)
# 用平均值填补数据
s2 = Sim(missing_values=np.nan, strategy='mean')
s2 = s2.fit(Xtrain.loc[:,col]) # fit
Xtrain.loc[:,col] = s2.transform(Xtrain.loc[:,col]) # transform
Xtest.loc[:,col] = s2.transform(Xtest.loc[:,col])

'''无量纲化处理'''
s3 = StandardScaler()
s3 = s3.fit(Xtrain.loc[:,col]) # fit
Xtrain.loc[:,col] = s3.transform(Xtrain.loc[:,col]) # transform
Xtest.loc[:,col] = s3.transform(Xtest.loc[:,col])

'''SVM算法'''
for kernel in ['linear','poly','rbf','sigmoid']:
    clf = SVC(kernel=kernel,gamma='auto',degree=1,cache_size=5000).fit(Xtrain,Ytrain)
    res = clf.predict(Xtest) # 测试结果
    score = clf.score(Xtest,Ytest) # 返回准确率
    recall = recall_score(Ytest,res) # 返回召回率
    auc = roc_auc_score(Ytest, clf.decision_function(Xtest)) # 返回auc面积
    # display = plot_roc_curve(clf,Xtest,Ytest) # ROC曲线
    # plt.title('The ROC curve of %s'%(kernel))
    # plt.show()
    print('%s 准确率%.3f, 召回率%.3f, AUC面积%.3f'%(kernel,score,recall,auc))
    print('混淆矩阵:')
    print(confusion_matrix(Ytest,res))

控制台结果

ROC曲线


标签:loc,SVM,Rainfall,ROC,矩阵,Ytrain,Xtrain,import,sklearn
来源: https://blog.csdn.net/ls080706/article/details/121680051

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有