Kaggle简单小例子代码

1.分类器例子

1.1 Logistic Regression分类器(乳腺肿瘤)

#_*_ coding:utf-8 _*_
"""
Logistics Regression模型和随机梯度下降(SGDC)用于乳腺肿瘤的二分类预测
"""
#导入工具包
import numpy as np
import pandas as pd

#第一步:数据预处理
#创建特征列表
column_names = ['Sample code number','Clump Thickness','Uniformity of Cell Size',
                'Uniformity of Cell Shape','Marginal Adhesion',
                'Signle Epithelial Cell Size','Bare Nuclei',
                'Bland Chromatin','Normal Nucleoli','Mitoses','Class']

#使用pandas.read_csv()从互联网读取数据集,其中names=column_names用于指定获取的数据每一项的含义
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',names=column_names)

#将?代替为标准缺失值(np.nan)表示
data = data.replace(to_replace='?',value=np.nan)
#丢弃带有标准缺失值的维度(只要有任何一维缺失),还有一种补充缺失值的办法是把那一维缺失的值用那一维的均值代替
data = data.dropna(how='any')

#输出data的数据量和维度
print(data.shape)
'''
经过上面的操作后,无缺失值的样本数为683条,特征向量包括细胞厚度,细胞大小,形状等9个维度,
并且每一个属性的取值范围都量化到1-10之间的数来表示。
'''

#第二步:将数据集划分为训练集和测试集
#使用sklearn.model_selection里的train_test_split划分数据集
from sklearn.model_selection import train_test_split
#随机采样25%的数据来测试,75%的数据用于训练
#train_test_split()接收两个参数,一个是样本特征向量:data[column_names[1:10]];以及样本对应的标签:data[column_names[10]]
#在指定数据划分的时候,如果测试集指定为0.25,而训练集指定为0.85,则代表训练集和测试集有重叠部分,但是一般不这么指定
X_train,X_test,y_train,y_test = train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=33)

#查验训练样本和测试样本的数目和类别分类
print('-------------------------')
print('训练样本的数目和类别样本:')
print(y_train.value_counts())
print('-------------------------')
print('测试样本的数目和类别样本:')
print(y_test.value_counts())
print('-------------------------')

#第三步:使用Logistic线性回归学习数据集并进行预测
#StandardScaler数据标准化,它属于sklearn的数据预处理包preprocessing下
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier


#标准化数据,使得每个维度的数据的方差为1,均值为0,使得预测结果不会被某些维度过大的特征值给主导
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
print('标准化数据运行完毕!')

print('初始化Logistic Regression 和 SGDClassifier!')
lr = LogisticRegression()
sgdc = SGDClassifier()

print('调用Logistic Regression中的fit()函数来训练模型参数:')
lr.fit(X_train,y_train)
print('使用训练好的模型lr对X_test进行预测,结果存储在变量lr_y_predict中')
lr_y_predict = lr.predict(X_test)

print('调用SGDCClassifer中的fit()函数来训练模型参数:')
sgdc.fit(X_train,y_train)
print('使用训练好的模型sgdc对x_test进行预测,结果存储在sgdc_y_predict中')
sgdc_y_predict = sgdc.predict(X_test)
print('运行完毕!!')

#第四步:评估分类器分类性能
print('使用学习器自带的score函数获得模型在测试集上的准确率:')
#这里score()函数传入X_test会调用上面的predict函数从而得到y的预测值,再与真实标签y_test进行对比得到准确率
lr_accuracy = lr.score(X_test,y_test)
print('Logistic回归的分类准确率为: %f'%lr_accuracy)
print('利用classification_report获得其他三个评估指标')
from sklearn.metrics import classification_report
#利用classification_report(分类报告)获得其他三个评估指标:F1-score;Precision;Recall
lr_report = classification_report(y_test,lr_y_predict,target_names=['良性','恶性'])
print(lr_report)

print('--------------------------')

print('使用学习器自带的score函数获得模型在测试集上的准确率:')
#这里score()函数传入X_test会调用上面的predict函数从而得到y的预测值,再与真实标签y_test进行对比得到准确率
sgdc_accuracy = sgdc.score(X_test,y_test)
print('随机梯度下降回归的分类准确率为: %f'%sgdc_accuracy)
print('利用classification_report获得其他三个评估指标')
from sklearn.metrics import classification_report
#利用classification_report(分类报告)获得其他三个评估指标:F1-score;Precision;Recall
#打印结果中的support代表的是你使用的数据个数,也就是数据的支撑集
sgdc_report = classification_report(y_test,sgdc_y_predict,target_names=['良性','恶性'])
print(sgdc_report)
#数据集比较小的时候sgdc的效果不是太好,但是一般情况下数据集大的时候都用sgdc,因为运行速度快,而lr模型评估笔记复杂。

1.2 LSVM手写体分类器

#_*_ coding:utf-8 _*_
"""
SVM分类器在手写数字识别中的应用
"""

#第一步:加载数据集,了解数据集的规模,特征属性的取值情况等信息。
print('从sklearn.datasets中导入手写数字家在函数')
from sklearn.datasets import load_digits
print('将加载的数据对象保存在digits变量中')
digits = load_digits()
print('digits对象是一个Bunch字典对象,所以输出它的key看看:')
print(digits.keys())

print('检测数据规模和特征维度:')
n_samples ,n_features = digits.data.shape
print((n_samples,n_features)) #(1797, 64)
print(digits.images.shape) #(1797, 8, 8)
'''
上面的结果说明共有1797个手写字体的图像,每个图像是8*8灰度图像,
data里面的样本特征向量是直接把对应的字符图像按行展开成一列,
变成64维特征向量,下面导入Matplotlib将数字相比图像展现出来。
'''

import matplotlib.pyplot as plt
#设置画布
fig = plt.figure(figsize=(6,6)) #画布尺寸
fig.subplots_adjust(left=0,right=1,bottom=0,top=1,hspace=0.05,wspace=0.05)

#绘制数字:每张图像8x8像素点
for i in range(64):
    ax = fig.add_subplot(8,8,i+1,xticks=[],yticks=[])
    ax.imshow(digits.images[i],cmap=plt.cm.binary,interpolation='nearest')
    #用目标值标记图像
    ax.text(0,7,str(digits.target[i]))

plt.show()

#第二步:把数据集划分成训练集和测试集
print('使用sklearn.model_selection里的train_test_split划分数据集')
from sklearn.model_selection import train_test_split
print('随机采样25%的数据用于测试,75%用于训练')
X_train,X_test,y_train,y_test = train_test_split(digits.data,digits.target,test_size=0.25,random_state=33,stratify=digits.target)

print('查验训练样本和测试样本的数目和类别分类')
import numpy as np
print('训练样本的数目和类别样本:')
print(np.bincount(y_train))

print('测试样本的数目和类别样本:')
print(np.bincount(y_test))

#第三步:训练支持向量机对手写字体进行分类识别
#StandardScaler数据标准化,它属于sklearn的数据预处理包preprocessing下
from sklearn.preprocessing import StandardScaler
#从sklearn.svm里导入LinearSVC
from sklearn.svm import LinearSVC

print('标准化数据,使得每个维度的数据的方差为1,均值为0,使得预测结果不会被某些维度过大的特征值给主导')
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.fit_transform(X_test)
print('数据标准化运行完毕')

print('初始化线性支持向量分类器')
lsvc = LinearSVC()
print('进行模型训练')
lsvc.fit(X_train,y_train)
print('进行模型预测')
lsvc_pred_test = lsvc.predict(X_test)
print('运行完毕!')

#第四步:对模型的预测性能进行评估
print('使用学习器自带的score函数获得模型在测试集上的准确率:')
lsvc_accuracy = lsvc.score(X_test,y_test)
print('线性支持向量分类器的分类准确率:%f' %lsvc_accuracy)
print('利用classification_report获得其他三个评估指标')
from sklearn.metrics import classification_report
lsvc_report = classification_report(y_test,lsvc_pred_test,target_names=digits.target_names.astype(str))
print(lsvc_report)
'''
需要指出的是,precision,recall和f1-score这些一开始被用于二分类问题度量指标是无法直接用于多分类的。
通常的做法是将10个数字的分类任务看成是10个二分类问题,每一个问题中,将其中一个数字看成是正类,
其他数字看成是负类。最后将10个二分类问题的评估结果做平均作为多分类任务的性能评估。
'''

2. 回归例子

       待续。。。

猜你喜欢

转载自www.cnblogs.com/Stoner/p/9021252.html
今日推荐