"""
选出一个最合适的模型的方式是通过模型验证对模型进行评价,对于监督学习算法而言,一个
模型泛化能力越好,则这个模型的评价越高。这需要通过模型验证来测试不同模型对于未知数
据的表现。仅仅使用训练数据对模型进行评价往往会带来过度拟合的问题,这就需要将数据划分
分为训练集和测试集,再通过交叉验证测试模型对于不同组合的训练集和测试集的表现效果
"""
#数据集划分
"""
在分配训练集和测试集的时候,测试集的数据越小,对模型的泛化误差的估计将会越不准确,
所以需要对数据集的划分比例进行权衡,在实际应用中,基于整个数据集数据量的大小,通常
训练集数据和测试集数据的划分比例是 6:4、7:3 或 8:2,而对于庞大的数据可以使用
9:1的划分比例
"""
#导入cancer数据集,使用train_test_split函数将数据集按7:3的比例划分为训练集与测试集
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
x = cancer['data']
y = cancer['target']
print('cancer数据集维度为:',x.shape,'\n','cancer样本个数为:',y.shape)
#按7:3的比例划分数据集
x_train,x_test,y_train,y_test = train_test_split(x, y,test_size = 0.3,random_state=0)
print('训练集维数为:',x_train.shape,'\n','训练集样本个数为:',y_train.shape)
print('测试集维数为:',x_test.shape,'\n','测试集样本个数为:',y_test.shape)
#交叉验证
"""
不同的训练集、测试集分割的方法将会导致模型的准确率不同,而交叉验证的基本思想是将数据集进行
一系列分割,生成多组不同的训练与测试集对,然后分别训练模型并计算测试准确率,最后对结果进行
平均处理,从而有效降低测试准确率的差异
"""
#导入iris数据集,使用cross_val_score函数对SVM模型进行交叉验证
from sklearn import svm
from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel = 'linear',C=1)
score = cross_val_score(clf, cancer.data,cancer.target,cv = 5)
print('交叉验证结果为:\n',score)
#自动调参
"""
机器学习中的模型的参数调优有多种方式,包含手动调优,网络搜索、随机搜索以及基于贝叶斯的参数调优
方法,其中使用参数设置的网格法是目前最广泛使用的参数优化方法
scikit-skleaarn库中的model_selection模块中的GridSearchCV类实现了一种基于网格搜索的自动调参
方法,GridSearchCV会对参数值的所有可能的组合评估,从而计算出最佳的组合,但是此方法只适用于小数
据集,若数据量级较大则难以得出结果
"""
#加载iris数据集,构建PCA模型,之后构建GridSearchCV自动调参容器对PCA模型进行调参
from sklearn.model_selection import GridSearchCV
from sklearn.decomposition import PCA
#构建PCA模型
pca = PCA(n_components = 2)
#设置要调整的参数
param_grid = {'n_components':[1,2,3]}
#设置自动调参容器
grid_search = GridSearchCV(pca, param_grid = param_grid).fit(x,y)
print('自动调参容器为:\n',grid_search)
#查看最高得分的参数
print('最佳结果参数设置为:',grid_search.best_params_)
#模型评估
"""
scikit-learn库中有3中方法用于评价:估计器的score方法提供一个缺省的评估法则来对模型进行评价;
cross-validation的模型评估工具也能对模型进行评价,但依赖于内部的scoring策略;metrics模块
整合一组测量预测误差的简单函数,给出了基础真实的数据和预测
mertrcs模块中的评价函数可分为分类(classification)、回归(regression)、排序(ranking)、
聚类(clustering)等类别
查看某模块下有哪些函数:利用from 库名 import 模块名;dir(模块名) ;即可查看该模块下的所有函数名
"""
#1.分类模型评价函数
#使用分类评价函数评估数据的准确率、混淆矩阵,画出ROC曲线与对应的AUC值,
from sklearn.svm import SVC
SVC_model = SVC()
SVC_model.fit(x_train,y_train)
y_pred = SVC_model.predict(x_test)
#准确率
from sklearn.metrics import accuracy_score
print('准确率为:',accuracy_score(y_true=y_test, y_pred=y_pred))
#混淆矩阵
from sklearn.metrics import classification_report
print('混淆矩阵为:\n',classification_report(y_true=y_test, y_pred=y_pred))
#ROC曲线
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve,auc
fpr,tpr,thresholds = roc_curve(y_test, y_pred)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr,lw=1,label='ROC(area = %0.2f)'%(roc_auc))
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"%(roc_auc))
plt.show()
#2.回归模型评价函数
#metric模块中包含6中分类模型评价函数
"""
使用回归评价函数评估数据的均方差、平均绝对误差、中值绝对误差与R2决定系数
"""
#均方差
from sklearn.metrics import mean_absolute_error
print('均方差为:',mean_absolute_error(y_true=y_test, y_pred=y_pred))
#平均绝对误差
from sklearn.metrics import mean_absolute_error
print('平均绝对误差为:',mean_absolute_error(y_true=y_test, y_pred=y_pred))
#中值绝对误差
from sklearn.metrics import median_absolute_error
print('中值绝对误差为:',median_absolute_error(y_true=y_test, y_pred=y_pred))
from sklearn.metrics import r2_score
print('R2决定系数为:',r2_score(y_true = y_test,y_pred = y_pred))
#3.排序模型评价函数
#metrics模块中包含3中排序模型评价函数
#测量误差
import numpy as np
from sklearn.metrics import coverage_error
y_true = np.array([[1,0,0],[0,0,1]])
y_score = np.array([[0.75,0.5,1],[1,0.2,0.1]])
print('测量误差为:',coverage_error(y_true, y_score))
#标签排名精度
from sklearn.metrics import label_ranking_average_precision_score
print('标签排名平均精度为:',label_ranking_average_precision_score(y_true, y_score))
#排序损失为
from sklearn.metrics import label_ranking_loss
print('排序损失为:',label_ranking_loss(y_true, y_score))
#4.聚类模型评价函数
#metrics模块中包含4种聚类模型评价函数
"""
使用聚类模型评价函数评估K-means模型聚类结果的轮廓系数、同性质、完整性与调和平均
"""
#K-means聚类的轮廓系数、同质性、完整性与调和平均
from sklearn.cluster import KMeans
#使用K-means聚类
km = KMeans(n_clusters=2,random_state=0).fit(x)
#轮廓系数
from sklearn.metrics import silhouette_score
print('轮廓系数为:',silhouette_score(x,km.labels_,metric = 'euclidean'))
#同质性、完整性、调和平均
from sklearn.metrics import homogeneity_completeness_v_measure
km_pred = km.predict(x)
print('同质性,完整性,调和平均分别为:\n',homogeneity_completeness_v_measure(y, km_pred))