根据已给字符数据,训练逻辑回归、随机森林、SVM,生成ROC和箱线图

代码下载:here。

已知训练数据如下:


预处理代码如下:

# -*- coding: utf-8 -*-
"""
Created on 2017 11.17
@author: liupeng
"""

import pandas as pd  
import numpy as np  
from sklearn.preprocessing import LabelEncoder  
from sklearn.preprocessing import StandardScaler  
  
train_data = pd.read_csv("bank-full.csv")  

train_data = train_data['age;"job";"marital";"education";"default";"balance";"housing";"loan";"contact";"day";"month";"duration";"campaign";"pdays";"previous";"poutcome";"y"'].str.split(';',expand=True)  

text = '"job";"marital";"education";"default";"balance";"housing";"loan";"contact";"day";"month";"duration";"campaign";"pdays";"previous";"poutcome";"y"'
text = str(text)
text = text.split(';')

train_data = pd.DataFrame(train_data.values[0::, 1::], index=train_data.values[0::, 0].astype(np.int), columns = text)  
train_data.index.name = "age" 
train_data.to_csv("input.csv")  

# print (train_data)


train_data = pd.read_csv("input.csv")  

data = []
y = train_data['age']
data.append(y)
train_data['age'] = y
y = train_data['"job"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"job"'] = y
y = train_data['"marital"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"marital"'] = y
y = train_data['"education"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"education"'] = y
y = train_data['"default"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"default"'] = y
y = train_data['"balance"']
data.append(y)
train_data['"balance"'] = y
y = train_data['"housing"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"housing"'] = y
y = train_data['"loan"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"loan"'] = y
y = train_data['"contact"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"contact"'] = y
y = train_data['"day"']
data.append(y)
train_data['"day"'] = y
y = train_data['"month"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"month"'] = y
y = train_data['"duration"']
data.append(y)
train_data['"duration"'] = y
y = train_data['"campaign"']
data.append(y)
train_data['"campaign"'] = y
y = train_data['"pdays"']
data.append(y)
train_data['"pdays"'] = y
y = train_data['"previous"']
data.append(y)
train_data['"previous"'] = y
y = train_data['"poutcome"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"poutcome"'] = y
y = train_data['"y"']
y = LabelEncoder().fit(y).transform(y)  
data.append(y)
train_data['"y"'] = y

# 将每一列数据进行归一化
train_data = train_data.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))  #方法一  
print ('train_data.values[0::, 0]', train_data.values[0::, 0])

train_data = pd.DataFrame(train_data.values[0::, 1::], index=train_data.values[0::, 0], columns = text)  
train_data.index.name = "age" 
train_data.to_csv("train_data.csv")  

print (train_data)


训练测试模型代码如下:

# -*- coding: utf-8 -*-
"""
Created on 2017 11.17
@author: liupeng
"""

import pandas as pd  
import numpy as np  
from sklearn.preprocessing import LabelEncoder  
from sklearn.preprocessing import StandardScaler  


from sklearn import cross_validation
from sklearn.metrics import roc_curve, auc  
from scipy import interp
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
# ROC曲线。
def c_roc(y_pred, y_test):
    mean_tpr = 0.0  
    mean_fpr = np.linspace(0, 1, 1000)  
    all_tpr = [] 
    fpr, tpr, thresholds = roc_curve(y_test, y_pred )
    mean_tpr += interp(mean_fpr, fpr, tpr)          #对mean_tpr在mean_fpr处进行插值,通过scipy包调用interp()函数  
    mean_tpr[0] = 0.0                               #初始处为0  
    roc_auc = auc(fpr, tpr)  
    plt.plot(fpr, tpr, lw=1, label='LogisticRegression %d (area = %0.2f)' % (0, roc_auc)) 
    plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck')  
    plt.xlim([-0.05, 1.05])  
    plt.ylim([-0.05, 1.05])  
    plt.xlabel('False Positive Rate')  
    plt.ylabel('True Positive Rate')  
    plt.title('Receiver operating characteristic example')  
    plt.legend(loc="lower right")  
    plt.show() 
# 箱线图。
def c_boxplot(data):

    # Creating boxplots 
    fig = plt.figure(1, figsize=(9, 6))
    # Create an axes instance
    ax = fig.add_subplot(111)
    # 合并 X, y。
    #data = np.hstack((X,np.reshape(y,[-1, 1])))
    bp = ax.boxplot(data, patch_artist=True)
    #plt.boxplot(X, sym="o", whis=1.5)
    
    for box in bp['boxes']:
        # change outline color
        box.set( color='#7570b3', linewidth=2)
        # change fill color
        box.set( facecolor = '#1b9e77' )
    
    ## change color and linewidth of the whiskers
    for whisker in bp['whiskers']:
        whisker.set(color='#7570b3', linewidth=2)
    
    ## change color and linewidth of the caps
    for cap in bp['caps']:
        cap.set(color='#7570b3', linewidth=2)
    
    ## change color and linewidth of the medians
    for median in bp['medians']:
        median.set(color='#b2df8a', linewidth=2)
    
    ## change the style of fliers and their fill
    for flier in bp['fliers']:
        flier.set(marker='o', color='#e7298a', alpha=0.5)
    
    # Save the figure
    # fig.savefig('fig1.png', bbox_inches='tight')
    plt.show()


###获取数据和训练---------------------------------------------------------###
# 从 csv中读取训练数据和标签。
train_data = pd.read_csv("train_data.csv")  
print (train_data)

# 分离 训练样本 和 标签。
X = train_data.values[0::, 0:16]
y = train_data.values[0::, 16].astype(np.int)

# 仅取 5000 个样本。
X = X[40000:45000]
y = y[40000:45000]

print (X)
print (y)


# 5折交叉验证。
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size = 0.5, random_state = 0)
print (len(X_train), len(X_test), len(y_train), len(y_test))
#使用6折交叉验证,并且画ROC曲线,也可以用下面产生5折交叉验证,产生5个集合。
#cv = StratifiedKFold(y, n_folds=5) 

################LogisticRegression  
from sklearn.linear_model import LogisticRegression   
classifier = LogisticRegression()
classifier.fit(X_train, y_train)
# 预测
y_pred = classifier.predict(X_test)
y_train_pred = classifier.predict(X_train)
# 计算得分
scores = classifier.score(X_test , y_test)
print ('scores:', scores)

# 画ROC曲线
c_roc(y_pred, y_test)

# 合并 X, y。
data = np.hstack((X,np.reshape(y,[-1, 1])))
# 画 boxplot
c_boxplot(data)

# 计算混淆矩阵
confusion_matrix=confusion_matrix(y_test,y_pred)
print (confusion_matrix)
# 显示混淆矩阵
plt.matshow(confusion_matrix)
plt.title(u'混淆矩阵')
plt.colorbar()
plt.ylabel(u'实际类型')
plt.xlabel(u'预测类型')
plt.show()


###-------------------------------------------------------------------------------------###
# 以上的交叉验证只需要下面即可。
from sklearn.cross_validation import cross_val_score
# 在X,y原始数据上,计算5折交叉验证的准确率
classifier = LogisticRegression()

classifier.fit(X_train, y_train)
scores = classifier.score(X_test , y_test)
scores1 = np.mean(scores)
print ('LogisticRegression Accuracy:',np.mean(scores), scores)
y_pred = classifier.predict(X_test)
# 合并 X, y。
data = np.hstack((X_test,np.reshape(y_test,[-1, 1]), np.reshape(y_pred,[-1, 1])))
# 画 boxplot
c_boxplot(data)


################AdaBoostClassifier 
from sklearn.ensemble import AdaBoostClassifier  

classifier = AdaBoostClassifier(n_estimators=100) #迭代100次  

classifier.fit(X_train, y_train)
scores = classifier.score(X_test , y_test)
scores2 = np.mean(scores)
print ('AdaBoostClassifier Accuracy :',np.mean(scores), scores)
y_pred = classifier.predict(X_test)
# 合并 X, y。
data = np.hstack((X_test,np.reshape(y_test,[-1, 1]), np.reshape(y_pred,[-1, 1])))
# 画 boxplot
c_boxplot(data)


################RandomForestClassifier 
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators=100) #迭代100次  

classifier.fit(X_train, y_train)
scores = classifier.score(X_test , y_test)
scores3 = np.mean(scores)
print ('RandomForestClassifier Accuracy :',np.mean(scores), scores)   
y_pred = classifier.predict(X_test)
# 合并 X, y。
data = np.hstack((X_test,np.reshape(y_test,[-1, 1]), np.reshape(y_pred,[-1, 1])))
# 画 boxplot
c_boxplot(data)


###############radial basis functions, and support vector machines
from sklearn import svm

classifier = svm.SVC(kernel='linear')

classifier.fit(X_train, y_train)
scores = classifier.score(X_test , y_test)
scores4 = np.mean(scores)
print ('support vector machines(linear) Accuracy :',np.mean(scores), scores)   
y_pred = classifier.predict(X_test)
# 合并 X, y。
data = np.hstack((X_test,np.reshape(y_test,[-1, 1]), np.reshape(y_pred,[-1, 1])))
# 画 boxplot
c_boxplot(data)


classifier = svm.SVC(kernel='poly', degree=3)

classifier.fit(X_train, y_train)
scores = classifier.score(X_test , y_test)
scores5 = np.mean(scores)
print ('support vector machines(poly) Accuracy :',np.mean(scores), scores)   
y_pred = classifier.predict(X_test)
# 合并 X, y。
data = np.hstack((X_test,np.reshape(y_test,[-1, 1]), np.reshape(y_pred,[-1, 1])))
# 画 boxplot
c_boxplot(data)


classifier = svm.SVC(kernel='rbf')

classifier.fit(X_train, y_train)
scores = classifier.score(X_test , y_test)
scores6 = np.mean(scores)
print ('support vector machines(rbf) Accuracy :',np.mean(scores), scores)   
y_pred = classifier.predict(X_test)
# 合并 X, y。
data = np.hstack((X_test,np.reshape(y_test,[-1, 1]), np.reshape(y_pred,[-1, 1])))
# 画 boxplot
c_boxplot(data)


# 各准确率的比较
data = np.hstack((np.reshape(scores1,[-1, 1]), np.reshape(scores2,[-1, 1]),np.reshape(scores3,[-1, 1]),np.reshape(scores4,[-1, 1]),np.reshape(scores5,[-1, 1]), np.reshape(scores5,[-1, 1])))
# 画 boxplot
c_boxplot(data)


  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
随机森林算法和线性回归算法是两种常见的机器学习算法,它们在不同的场景下有着不同的应用和特点。 随机森林算法是一种集成学习方法,它由多个决策树组成。每个决策树都是通过对训练数据进行随机采样和特征选择来构建的。随机森林通过对每个决策树的预测结果进行投票或平均来得出最终的预测结果。相比于单个决策树,随机森林具有更好的泛化能力和抗过拟合能力。它适用于分类和回归问题,并且可以处理高维数据和大量特征。 线性回归算法是一种经典的回归算法,它建立了自变量和因变量之间的线性关系模型。线性回归通过最小化残差平方和来拟合数据,并得到最优的回归系数。线性回归适用于连续型因变量的预测问题,并且对数据的要求较低,计算速度较快。 下面是随机森林算法和线性回归算法的比较: 1. 预测能力:随机森林通常具有更好的预测能力,尤其在处理非线性关系和高维数据时表现更好。线性回归适用于简单的线性关系,对于非线性关系的拟合能力较弱。 2. 解释性:线性回归模型具有较好的解释性,可以通过回归系数来解释自变量对因变量的影响程度。而随机森林由多个决策树组成,难以直接解释每个特征的影响。 3. 计算复杂度:线性回归的计算复杂度较低,可以快速得到结果。而随机森林由多个决策树组成,计算复杂度较高,需要更多的计算资源和时间。 4. 对异常值和缺失值的处理:线性回归对异常值和缺失值较为敏感,可能会对模型产生较大影响。而随机森林对异常值和缺失值具有一定的鲁棒性,能够处理这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值