高斋晓开卷,独共圣人语。这篇文章主要讲述Scikit-learn——LogisticRegression与SGDClassifier相关的知识,希望能为你提供帮助。
??1.sklearn.linear_model.logistic regression??
一般来说,逻辑回归用梯度下降算法来求解参数比较常见;所以这也导致一开始误以为LogisticRegression模型就是用梯度下降算法来实现的,当遇到SGDClassifier(Stochastic Gradient Descent)随机梯度下降分类器的时候,就有点蒙了。梯度下降明明是一个求解算法,怎么就和分类器扯上关系了。原来SGDClassifier是一系列采用了梯度下降来求解参数的算法的集合,例如(SVM, logistic regression)等;
而sklearn中,LogisticRegression的实现方法是基于??“liblinear”, “newton-cg”, “lbfgs” and “sag”??这些库来实现的,当数据集特别大的时候,推荐使用SGDClassifier中的逻辑回归。下面简单介绍一下LogisticRegression的使用。
由于对于实现方法原理不是很清楚,所以所有参数就暂时都保持默认吧。
lr=LogisticRegression() # 初始化模型
lr.fit(X_train,y_train) # 拟合
??2.sklearn.linear_model.SGDClassifier??
SGDClassifier是一个用随机梯度下降算法训练的线性分类器的集合。默认情况下是一个线性??(软间隔)支持向量机??分类器。顺便说一句,有人可能会疑惑:大多数SVM的求解不都是用的SMO算法么?怎么这儿又跑来一个SGD算法。原因是因为,支持向量机的另一个解释就是最小化合页损失函数(详见李航统计学习方法P113)。因此,该损失函数同样可以通过梯度下降算法来求解参数。下面是SGDClassifier的基本使用方法:
需要注意的是,梯度下降对数据的范围异常敏感,所有要先进行??Feature scaling??
参数表 | 含义 |
loss | 损失函数选择项,字符串型;默认为’hinge’即SVM;log’为逻辑回归 |
penalty | 惩罚方式,字符串型;默认为’l2’;
其余有’none’,‘l1’,‘elasticnet’ |
alpha | 惩罚参数,浮点型;默认值为0.0001 |
n_iter | 迭代次数,整数型;默认值为5 |
learning_rate | 学习速率,字符串型;默认值为’optimal’,根据alpha计算得到 |
属性表 | 含义 |
coef_ | 参数 |
intercept_ | 截距 |
方法表 | 含义 |
fit(X,y) | 拟合 |
get_params() | 得到参数表中的所有参数 |
predict(X) | 预测 |
score(X,y) | 返回准确率 |
import pandas as pd
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import classification_report
column_name=[Sample code number,Clump Thickness,Uniformity of Cell Size,
Uniformity of Cell Shape,Marginal Adhesion,Single Epithelial Cell Size,
Bare Nuclei,Bland Chromatin,Normal Nucleoli,Mitoses,Class]
data=https://www.songbingjia.com/android/pd.read_csv(./DataSets/breast-cancer-wisconsin.data,names=column_name) # 读取数据集
data=https://www.songbingjia.com/android/data.replace(to_replace=?,value=np.nan) #将缺失值替换成NAN,(原始数据集缺失值用的是问号)
data=https://www.songbingjia.com/android/data.dropna(how=any) # 去掉所有包含缺失值的样本点
X_train,X_test,y_train,y_test=\\
train_test_split(data[column_name[1:10]],data[column_name[10]],test_size=0.25,random_state=33) # 取前10列为X,第10列为y,并且分割;random_state参数的作用是为了保证每次运行程序时都以同样的方式进行分割
#print y_train.value_counts() # 查看分割后的数据集
#print y_test.value_counts()
ss=StandardScaler() #feature scaling
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)
lr=LogisticRegression()
lr.fit(X_train,y_train)
lr_pre=lr.predict(X_test)
print lr.score(X_test,y_test)
print classification_report(y_test,lr_pre,
target_names=[Benign,Malignant])
sgdc=SGDClassifier(loss=log)
sgdc.fit(X_train,y_train)
sgdc_pre = sgdc.predict(X_test)
print sgdc.score(X_test,y_test)
print classification_report(y_test,sgdc_pre,
target_names=[Benign,Malignant])
> >
> >
> >
0.970760233918
precisionrecallf1-scoresupport
Benign0.960.990.98100
Malignant0.990.940.9671
avg / total0.970.970.97171
0.988304093567
precisionrecallf1-scoresupport
Benign0.990.990.99100
Malignant0.990.990.9971
avg / total0.990.990.99171
??源码及数据集??
更多内容欢迎扫码关注公众号月来客栈!
【Scikit-learn——LogisticRegression与SGDClassifier】
推荐阅读
- 使用rewrite规则实现将所有到a域名的访问rewrite到b域名
- linux之pkill命令
- npm常用命令速查表
- Nginx实现多级反向代理客户端IP透传
- 小胖学Linux day26~27:yum管理工具
- YAML语法Ansible Playbook剧本Ansible变量
- 安全必读:电脑是否中毒?揭秘杀毒的几个误区
- 如何避开攻击?QQ安全聊天的一些小技巧!
- 雨林木风winXP系统提示盗版的处理办法