一文搞定机器学习算法

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

pima = pd.read_csv('PimaIndiansdiabetes.csv')
#打印关于pima的数据描述
# print(pima.describe())#前25%的数,中位数,前75%的数
#查看正负样本各自的个数
# print(pima.groupby('Outcome').size())
#可视化直方图
# pima.hist(figsize=(16,14))
# plt.waitforbuttonpress(0)
#绘制多变量图
# sns.pairplot(pima,vars=pima.columns[:-1],hue = 'Outcome')
# plt.show()
"""
4 # seaborn常用命令
 5 #【1】set_style()是用来设置主题的,Seaborn有5个预设好的主题:darkgrid、whitegrid、dark、white、ticks,默认为darkgrid
 6 #【2】set()通过设置参数可以用来设置背景,调色板等,更加常用
 7 #【3】displot()为hist加强版
 8 #【4】kdeplot()为密度曲线图
 9 #【5】boxplot()为箱图
10 #【6】joinplot()联合分布图
11 #【7】heatmap()热点图
12 #【8】pairplot()多变量图,可以支持各种类型的变量分析,是特征分析很好用的工具
13 # data:必不可少的数据;hue:用一个特征来显示图像上的颜色,类似于打标签;vars:只留几个特征两两比较,否则使用data的全部变量;
"""
#计算变量的相关系数,得到一个N*N的矩阵
# corr = pima.corr()
# plt.subplots(figsize=(14,12))
# sns.heatmap(corr,annot=True)
# plt.show()

"""
特征提取
"""
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
"""
SelectKBest只保留k个最高分的特征
SelectPercentile只保留用户指定百分比的最高得分的特征
使用常见的单变量统计检验:假正率SelectFpr,错误发现率SelectFdr,或者总体错误率SelectFwe
GenericUnivariateSelect通过结构化策略进行特征选择,通过超参数搜索估计器进行特征选择
SelectKBest和SelectPercentile能够返回特征评价的得分和P值
score_func有以下选项:
1、回归
f_regression:相关系数,计算每个变量与目标变量的相关系数,然后计算出F值和P值
mutual_info_regression:互信息,互信息度量x和y共享的信息,它度量的是已知两个变量中的其中一个对另一个不确定度的减少程度
2、分类
chi2:卡方检验
f_classif:方差分析,计算方差分析(ANOVA)的F值(组间均方/组内均方)
mutual_info_classif
"""
#划分特征和标签
X = pima.iloc[:,0:8]
Y = pima.iloc[:,8]
#通过卡方检验选择4个得分最高的特征
select_top_4 = SelectKBest(score_func=chi2,k=4)
fit = select_top_4.fit(X,Y)
features = fit.transform(X)#特征转换
#构造新特征DataFrame
X_features = pd.DataFrame(data=features,columns=['Glucose','Insuin','BMI','Age'])
"""
Standardization标准化
"""
#它将属性值更改为均值为0,标准差为1的高斯分布
#当算法期望输入特征为高斯分布式时非常有用
from sklearn.preprocessing import StandardScaler
rescaledX = StandardScaler().fit_transform(X_features)
X = pd.DataFrame(data=rescaledX,columns=X_features.columns)

"""
机器学习算法
"""
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

#切分数据集
x_train,x_test,y_train,y_test = train_test_split(X,Y,random_state=2019,test_size=0.2)#测试集占0.2,random_state:随机数种子

#创建模型列表尝试不同模型
models = []
models.append(('LR',LogisticRegression()))
models.append(('NB',GaussianNB()))
models.append(('KNN',KNeighborsClassifier()))
models.append(('DT',DecisionTreeClassifier()))
models.append(('SVM',SVC()))

#消除警告
import warnings
warnings.filterwarnings('ignore')

results = []
names = []
for name,model in models:
    kflod = KFold(n_splits=10,random_state=2019)
    cv_result =cross_val_score(model,x_train,y_train,cv=kflod,scoring='accuracy')
    names.append(name)
    results.append(cv_result)
print(results,names)

"""
PCA是常用的提取数据的手段,其功能是提取主成分,摒弃冗余信息,从而得到压缩后的数据,
实现维度的下降。其设想通过投影矩阵将高纬信息转换到另一个坐标系下,并通过平移将数据均值变为0.
PCA认为在变换过后的数据中,在某一维度上数据分布的更分散那么数据点分布情况的解释力就更强。
所以PCA是通过方差衡量数据在各个方向上投影的分布情况进而对有效的低纬方向进行选择。
KernelPCA将非线性可分的数据转换到一个适合对齐进行线性分类的新的低维子空间上,通过非线性映射
将数据转换到一个高纬空间中,在高维空间中使用PCA将其映射到另一个低维空间中,并通过线性分类器对样本进行划分
核函数:通过两个向量点积来度量向量间相似度的函数。
KPCA是升维的,但目的都是让数据在目标维度中可分。
"""
from sklearn.decomposition import KernelPCA
kpca = KernelPCA(n_components=2,kernel='rbf')
x_train_pca = kpca.fit_transform(x_train)
x_test_pca = kpca.transform(x_test)
"""
 # fit和transform没有任何关系,仅仅是数据处理的两个不同环节,之所以出来fit_transform这个函数名,仅仅是为了写代码方便,会高效一点。
10 
11 # sklearn里的封装好的各种算法使用前都要fit,fit相对于整个代码而言,为后续API服务。fit之后,然后调用各种API方法,
12 # transform只是其中一个API方法,所以当你调用transform之外的方法,也必须要先fit。
13 
14 # fit原义指的是安装、使适合的意思,其实有点train的含义,但是和train不同的是,它并不是一个训练的过程,而是一个适配的过程,
15 # 过程都是确定的,最后得到一个可用于转换的有价值的信息。
16 
17 # 1、必须先用fit_transform(trainData),之后再transform(testData)
18 # 2、如果直接transform(testData),程序会报错
19 # 3、如果fit_transfrom(trainData)后,使用fit_transform(testData)而不transform(testData),虽然也能归一化,
20 # 但是两个结果不是在同一个“标准”下的,具有明显差异。(一定要避免这种情况)
21 
22 # 4、fit_transform()干了两件事:fit找到数据转换规则,并将数据标准化
23 # 5、transform()可以直接把转换规则拿来用,所以并不需要fit_transform(),否则,两次标准化后的数据格式就不一样了
"""

"""
使用网格搜索来提高模型
GridSearchCV存在的意义就是自动调参,只要把参数输进去就能给出最优化的结果和参数
C:错误项的惩罚系数,c越大对分错样本的惩罚程度就越大,但泛华能力降低
gama:auto
核函数有'rbf','poly','sigmoid'
"""

from sklearn.model_selection import GridSearchCV
param_grid = {'C':[0.1, 1, 10, 100], 'gamma':[1, 0.1, 0.01, 0.001]}
grid = GridSearchCV(SVC(),param_grid,refit=True,verbose = 2)
grid.fit(x_train_pca, y_train)
grid_predictions = grid.predict(x_test_pca)
print(classification_report(y_test,grid_predictions))

#可视化结果
ax = sns.boxplot(data = results)
ax.set_xticklabels(names)
plt.show()
# 通过盒图,在分析数据的时候,盒图能够有效地帮助我们识别数据的特征:
#  直观地识别数据集中的异常值(查看离群点)。
#  判断数据集的数据离散程度和偏向(观察盒子的长度,上下隔间的形状,以及胡须的长度)。

"""
逻辑回归
"""
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

lr = LogisticRegression() # LR模型构建
lr.fit(x_train, y_train) #
predictions = lr.predict(x_test) # 使用测试值预测
print(accuracy_score(y_test, predictions)) # 打印评估指标(分类准确率)
print(classification_report(y_test,predictions))
conf = confusion_matrix(y_test, predictions) # 混淆矩阵
label = ["0","1"] #
sns.heatmap(conf, annot = True, xticklabels=label, yticklabels=label)
plt.show()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值