数据科学机器学习python——分类模型代码实现【KNN决策树逻辑回归贝叶斯】

数据科学机器学习python——分类模型代码实现【KNN 决策树逻辑回归贝叶
斯】
分类模型评估分类模型指标:正确率accuracy、F值F-measure、精度precision、召回率recall 逻辑回归风险评估中最经典最常⽤的模型
通常解决⼆分类问题,即预测⽬标y的取值范围为{1,-1}从线性回归到逻辑回归线性回归存在问题:y取值为连续实数⽽⾮离散值——解决:引⼊逻辑斯蒂函数,将连续性的输出映射到(0,1)之间当输⼊x很⼤或很⼩时,函数接近于0或1的值输出,σ(0)=0.5使⽤逻辑斯蒂函数,可将任意实数映射到(0,1)之间,在逻辑回归中可解释为样本属于正类y=1的概率,记
样本x 为正类的概率为:
样本x 为负类的概率为:可统⼀为:
利⽤逻辑斯蒂函数,建⽴⼆元预测⽬标与原始输⼊之间的关系参数估计⼆分类【逻辑斯蒂函数】
训练集D={(x ,y ),(x ,y ),…,(x ,y )},最⼤似然法估计参数w,似然函数:对L(w)取对数,得到训练集的负对数似然:即⽬标为:min NLL(w)【梯度下降法】,w←w-η▽NLL(w),η:学习率,▽NLL(w)为⽬标函数对于参数w的梯度记,因为所以w←多分类将逻辑斯蒂函数替换成softmax函数
训练集D={(x ,y ),(x ,y ),…,(x ,y )},其中每⼀个样本可能属于C种类别,即y ∈{1,2,…,C},在逻辑回归中仅有⼀个d维的参数向量w,但在多分类的情况下,每⼀个类别c都需要⼀个参数向量w ,参数为W={w ,w ,…w }
i i 1122n n 1122n n i c 12C
其条件概率p(y |x )
K 近邻KNN 最经典、简单的有监督学习⽅法,适⽤于当数据的分布只有很少或者没有任何先验知识时,既能解决分类问题,也能解决回归问题原理简单:当对测试样本进⾏分类时,⾸先扫描训练集,到与该测试样本最相似的k个训练样本,根据这k个样本的类别进⾏投票确定测试样本的类别【k个样本⾥哪个类别最多则可预测测试样本也为该类别,可形象化为在⼆维图种,以测试样本为圆⼼画圆,
园内哪类样本多,则可预测测试样本也为该类别】;也可以通过k个样本与测试样本的相似程度进⾏加权投票流程:1确定k的⼤⼩和距离计算的⽅法;2从训练样本中得到k个与测试样本最相似的样本3根据k个最相似训练样本的类别,通过投票的⽅式来确定测试样本的类别核⼼问题1寻测试样本“近邻”的⽅法,即如何计算样本之间的距离或相似度2如何选择k值⼤⼩3当训练集样本数量较多或维度较⼤时,如何快速预测当样本数据能够表⽰为多维的连续型取值时,可选择欧式距离
k 值的选择慢慢试提⾼预测性能K近邻算法在进⾏预测时的时间复杂度为O
优点:简单实⽤,易于实现;对于⼆分类问题,如果训练集⽆限⼤,K近邻算法的泛化误差的上界为贝叶斯错误率的两倍;对异常数据不敏感【抗噪性】缺点:计算效率不⾼,当训练集较⼩时,易导致过度拟合除了解决分类问题,还可解决回归问题:
呼风唤雨的世纪教学设计样本x的预测值:d(x ,x )为样本x  到样本x
之间的距离决策树模型核⼼问题:如何根据训练数据,⾃动⽣成决策树决策树的⽣成根结点开始,选择对应特征;然后选择该节点特征的分裂点,根据分裂点分裂节点当某⼀节点中数据只属于某类别(分类问题)或者⽅差较⼩(回归问题)时,节点则不再进⾏进⼀步分裂核⼼问题:选择节点特征和特征分裂点
生态地质调查不纯度:⽤来表⽰落在当前节点的样本的类别分布均衡程度【分裂节点⽬标:样本类别分布更不均衡,即降低不纯度】不纯度越低越好
软暴力将被严惩
根据不纯度的下降程度来选择特征和对应的分裂点
i i i j I j
根据不纯度的下降程度来选择特征和对应的分裂点节点不纯度度量⽅法:Gini指数、信息熵、误分率Gini指数当样本均匀分布在每⼀个类中,则Gini指数为1-1/C,不纯度⼤当样本都分布在同⼀类时,Gini指数为0,不纯度⼩当⼀个节点t被分成K个⼦节点时,分割的Gini指数为
挑选使Gini(t)-Gini 最⼤的特征进⾏分裂信息熵:描述信息不确定度
当样本均匀分布在每⼀个类中,熵为log C,说明不纯度⼤当样本属于同⼀个类时,熵为0,说明不纯度⼩信息增益:节点分裂前后信息熵的下降值缺点:倾向于分裂成很多⼩节点(节点的样本数较⼩),容易造成过拟合信息增益率:节点分裂的⼦节点的样本数信息误分率按当前多数类来预测当前节点样本的类别时,被错误分类的数据⽐例当样本均匀分布在每⼀个类中,则Gini指数为1-1/C,不纯度最⼤当样本都分布在同⼀类时,Gini指数为0,不纯度最⼩节点不纯度对于⼆分类,p是正类样本的⽐例,则Gini:2p(1-p)
信息熵:-plog p-(1-p)log (1-p)误分率:1-max(p,1-p)信息熵最⼤,对不纯度的惩罚最强决策树的修剪树分太细-过于复杂、过度拟合【例,每个树叶只包含⼀个样本,训练误差为0,但易造成过拟合】朴
素贝叶斯基于贝叶斯定理和特征条件独⽴性假设的分类⽅法贝叶斯定理使⽤贝叶斯定理预测对于某⼀样本X,p(X)固定,上述式⼦等价于条件独⽴性假设朴素贝叶斯分类器
实践代码
KNN
#K 近邻
import  pandas as  pd
split 222
import pandas as pd搜集资料
from sklearn import cross_validation
from sklearn import metrics
ighbors import KNeighborsClassifier
from sklearn import preprocessing
##整数编码-diagnosis
def integer_coding(diagnosis):
dignosis_dict ={"B":0,"M":1}
diagnosis = diagnosis.map(dignosis_dict)
print(diagnosis)
return diagnosis
##数据标准化
def min_max_normalize(x):
return(x - x.min())/(x.max()- x.min())
##划分训练集和测试集
def partition(dataset, y):
dataset_minmax_train, dataset_minmax_test,\
dataset_train_labels, dataset_test_labels \
= ain_test_split(dataset, y, test_size=0.3, random_state=0)
print(dataset_train_labels.value_counts()/len(dataset_train_labels))
print(dataset_test_labels.value_counts()/len(dataset_test_labels))
return dataset_minmax_train, dataset_minmax_test,\
dataset_train_labels, dataset_test_labels
##模型训练
def knn(minmax_train, train_labels, minmax_test, n_neighbors, test_labels):
#train
knn_model = KNeighborsClassifier(n_neighbors)
knn_model.fit(minmax_train, train_labels)
test_pred = knn_model.predict(minmax_test)
#test
accuracy = metrics.accuracy_score(test_labels, test_pred)
confusion_mat = fusion_matrix(test_labels, test_pred)
print("分类报告:\n", metrics.classification_report(test_labels, test_pred)) print("k = ", k)
河北科技师范学院图书馆print("\t正确率: ",'%.2f'%(accuracy*100)+"%")
print("\t假阴性:", confusion_mat[0,1])
print("","\t假阳性:", confusion_mat[1,0])
return test_pred
##Z-Score标准化
def Z_Score(dataset):
dataset_zscore = pd.DataFrame(preprocessing.scale(dataset),\
columns = lumns)
print(dataset_zscore.head(5))
print(dataset_zscore.an())
print(dataset_zscore.area_mean.std())
return dataset_zscore
if __name__=="__main__":
breast_cancer = pd.read_csv('wisc_bc_data.csv',\
engine='python')
print(breast_cancer.shape)
print(breast_cancer.head(10))
del breast_cancer["id"]
靖州县print(breast_cancer.diagnosis.value_counts())
print(breast_cancer.diagnosis.value_counts()/len(breast_cancer))
breast_cancer["diagnosis"]= integer_coding(breast_cancer["diagnosis"])
print(breast_cancer[["radius_mean","area_mean","smoothness_mean"]].describe())
##Min_Max
print('\n')
print("-------------------------------Min_Max-------------------------------")
print('\n')
#数据标准化-minmax
for col in lumns[1:31]:
breast_cancer[col]= min_max_normalize(breast_cancer[col])
print(breast_cancer.iloc[:,1:].describe())#是否正确标准化
#数据集划分
y = breast_cancer['diagnosis']
del breast_cancer['diagnosis']
breast_cancer_minmax_train, breast_cancer_minmax_test,\
breast_cancer_train_labels, breast_cancer_test_labels = partition(breast_cancer, y)
print(breast_cancer_minmax_train)
#knn
k_list =(1,3,5,7,9,11,15,21,27)
for k in k_list:
knn(breast_cancer_minmax_train, breast_cancer_train_labels, \
breast_cancer_minmax_test, k, breast_cancer_test_labels)
##Z-Score
print('\n')
print("-------------------------------Z-Score-------------------------------")
print('\n')
#数据标准化-zscore
breast_cancer_zscore = Z_Score(breast_cancer)
#数据集划分
breast_cancer_zscore_train, breast_cancer_zscore_test,\
breast_cancer_zscore_train_labels, breast_cancer_zscore_test_labels  = partition(breast_cancer_zscore, y)
#knn
k_list =(1,3,5,7,9,11,15,21,27)
for k in k_list:
knn(breast_cancer_zscore_train, breast_cancer_zscore_train_labels,\
breast_cancer_zscore_test, k, breast_cancer_zscore_test_labels)
贝叶斯
import numpy as np
import pandas as pd
from sklearn import cross_validation
##整数编码-diagnosis
def integer_coding(diagnosis):
dignosis_dict ={"B":0,"M":1}
diagnosis = diagnosis.map(dignosis_dict)
print('!!', diagnosis)
return diagnosis
##数据标准化

本文发布于:2024-09-21 03:25:38,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/326276.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:样本   分类   节点   问题   类别
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议