分类算法实例一:用Logistic算法进行乳腺癌数据分类

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import warnings
import sklearn
from sklearn.linear_model import LogisticRegressionCV,LinearRegression
from sklearn.linear_model.coordinate_descent import ConvergenceWarning
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 设置字符集,防止中文乱码
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
# 拦截异常
warnings.filterwarnings(action = 'ignore', category=ConvergenceWarning)

# 数据读取并处理异常数据
path = "datas/breast-cancer-wisconsin.data"
names = ['id','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape',
         'Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei',
        'Bland Chromatin','Normal Nucleoli','Mitoses','Class']

df = pd.read_csv(path, header=None, names=names)
# 只要有列为空,就进行删除操作
datas = df.replace('?', np.nan).dropna(how = 'any')
# 显示前5条数据
datas.head(5)

# 1. 数据提取以及数据分隔
# 数据提取
X = datas[names[1:10]]
Y = datas[names[10]]
# 数据分隔
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.1,random_state=0)

# 2. 数据格式化(归一化数据)
ss = StandardScaler()
X_train = ss.fit_transform(X_train)

# 3. 模型构建及训练
# penalty:过拟合解决参数,取值l1或者l2
# solver:参数优化方式
# 当penalty为l1的时候,参数只能是:liblinear(坐标轴下降法)
# nlbfgs和cg都是关于目标函数的二阶泰勒展开
# 当penalty为l2的时候,参数可以是:lbfgs(拟牛顿法)、newton-cg(牛顿法变种)、seg(minibatch)
# 维度<10000时,lbfgs法比较好,维度>10000时,cg法比较好,显卡计算的时候,lbfgs和cg都比seg快
# multi_class:分类方式参数;参数可选:ovr(默认)、multinomial;这两种方式在二元分类问题中,效果是一样的;在多元分类问题中,效果不一样
# ovr:one-vs-rest, 对于多元分类的问题,先将其看做二元分类,分类完成后,再迭代对其中一类继续进行二元分类
# multinomial:many-vs-many(MVM),对于多元分类问题,如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来
# 不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类
# class_weight:特征权重参数
# Logistic回归是一种分类算法,不能应用于回归中(也即是说对于传入模型的y值来讲,不能是float类型,必须是int类型)

lr = LogisticRegressionCV(multi_class='ovr', fit_intercept=True, Cs=np.logspace(-2, 2, 20), cv=2, penalty='l2', solver='lbfgs', tol=0.01)
re = lr.fit(X_train, Y_train)

# 4. 模型效果获取
r = re.score(X_train, Y_train)
print("R值(准确率):", r)
print("稀疏化特征比率:%.2f%%" % (np.mean(lr.coef_.ravel() == 0) * 100))
print("参数:",re.coef_)
print("截距:",re.intercept_)
print(re.predict_proba(X_test))

# 5. 模型相关信息保存
# 引入包
from sklearn.externals import joblib
# 将标准化模型保存,要求文件夹必须存在
joblib.dump(ss, "datas/logistic/ss.model")
# 将模型保存,要求文件夹必须存在
joblib.dump(lr, "datas/models/logistic/lr.model")

# 6. 模型加载
# 引入包
from sklearn.externals import joblib
oss = joblib.load("models/logistic/ss.model")
olr = joblib.load("models/logistic/lr.model")

# 数据预测
# a. 预测数据格式化(归一化)
X_test = ss.transform(X_test) # 使用模型进行归一化操作
# b. 结果数据预测
Y_predict = re.predict(X_test)
# c. 图表展示
x_len = range(len(X_test))
plt.figure(figsize=(14,7), facecolor='w')
plt.ylim(0,6)
plt.plot(x_len, Y_test, 'ro',markersize = 8, zorder=3, label=u'真实值')
plt.plot(x_len, Y_predict, 'go', markersize = 14, zorder=2, label=u'预测值,$R^2$=%.3f' % re.score(X_test, Y_test))
plt.legend(loc = 'upper left')
plt.xlabel(u'数据编号', fontsize=18)
plt.ylabel(u'乳腺癌类型', fontsize=18)
plt.title(u'Logistic回归算法对数据进行分类', fontsize=20)
plt.show()

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页