1.Python自带的数据集
sklearn 提供多种类型的数据集
自带的小数据集(packaged dataset):sklearn.datasets.load_
可在线下载的数据集(Downloaded Dataset):sklearn.datasets.fetch_
计算机生成的数据集(Generated Dataset):sklearn.datasets.make_
其中常用的自带小数据集有如下几个:
(1)鸢尾花数据集:load_iris():用于分类任务的数据集
(2)手写数字数据集:load_digits():用于分类任务或者降维任务的数据集
(3)乳腺癌数据集load-breast-cancer():简单经典的用于二分类任务的数据集
(4) 糖尿病数据集:load-diabetes():经典的用于回归认为的数据集,值得注意的是,这10个特征中的每个特征都已经被处理成0均值,方差归一化的特征值。
(5)波士顿房价数据集:load-boston():经典的用于回归任务的数据集
(6)体能训练数据集:load-linnerud():经典的用于多变量回归任务的数据集。
数据集的调用方法(以小数据集中的diabetes数据集为例)
from sklearn.datasets import load_diabetes#其他数据集只用改数据集名称即可
diabetes=load_diabetes()
y=diabetes.target#提取数据集中的因变量
X=diabetes.data#提取数据集中的自变量
##这个数据集本身就是标准化过的
2.线性回归
sklearn中的LinearRegression模块提供了线性回归的功能,拟合线性模型的过程如下。
系数说明:
copy_X : boolean, optional, default True. If True, X will be copied; else, it may be overwritten.(是否复制原数据)
fit_intercept : boolean, optional, default True. whether to calculate the intercept for this model. If set to False, no intercept will be used in calculations(是否加入截距项)
normalize : boolean, optional, default False(是否正则化,默认是不用)
This parameter is ignored when fit_intercept
is set to False.(如果没有截距项进入回归,正则化选项可以自动忽略)
If True, the regressors X will be normalized before regression by subtracting the mean and dividing by the l2-norm.
If you wish to standardize, please use:class:sklearn.preprocessing.StandardScaler
before calling fit
on an estimator with normalize=False
.(标准化的操作步骤,使用standard.scalar模块并设置正则化=F)
n_jobs : int or None, optional (default=None) The number of jobs to use for the computation. This will only provide speedup for n_targets > 1 and sufficient large problems.
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
diabetes=load_diabetes()
y=diabetes.target
X=diabetes.data
X_train,X_test,Y_train,Y_test=train_test_split(X,y,test_size=0.3,random_state=0)
reg = LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False).fit(X_train,Y_train)
print('系数矩阵是:\n',reg.coef_)
print('截距项是:\n',reg.intercept_)
print('R方为:\n',reg.score(X_train,Y_train))
predicted=reg.predict(X_test)
print(predicted)
print(Y_test)
print('测试数据R方为:\n',reg.score(X_test,Y_test))
>>>
系数矩阵是:
[ -52.46990775 -193.51064552 579.4827762 272.46404234 -504.72401371
241.68441866 -69.73618783 86.62018451 721.95580222 26.77887028]
截距项是:
153.71914540545853
R方为:
0.5539411781927147
测试数据R方为:
0.3928939845074759
3.logistics回归
sklearn中主要使用LogistcRegression和LogistcRegressionCV来训练logistic回归模型,两者的主要区别在于后者使用了交叉验证来选择正则化系数C,前者则需要每次指定一个正则化系数。基本调用形式和各个参数的含义如下:
class sklearn.linear_model.LogisticRegression(penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=’warn’, max_iter=100, multi_class=’warn’, verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegressionCV
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
breast_cancer=load_breast_cancer()
print(breast_cancer)
X=breast_cancer.data
y=breast_cancer.target
X_train,X_test,Y_train,Y_test=train_test_split(X,y,test_size=0.3,random_state=0)
ss=StandardScaler()
X_train=ss.fit_transform(X_train)#先划分测试集和训练集,再标准化训练集,测试集不需要标准化
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)
r = re.score(X_train,Y_train)
print("R值(准确率):",r)
print("参数:",re.coef_)
print("截距:",re.intercept_)
print(re.predict_proba(X_test))
>>>
>#略
R值(准确率): 0.9874371859296482
参数: [[-0.34486035 -0.53628543 -0.34459404 -0.37684802 -0.18716336 0.19908779
-0.53832928 -0.61453587 -0.29450262 0.14834158 -1.01412254 0.06269686
-0.75010516 -0.70123202 0.1994603 0.638089 -0.0399029 -0.24843131
0.12942495 0.60158718 -0.70680499 -0.74279518 -0.63271232 -0.66219903
-0.50030358 0.01662864 -0.67326853 -0.85140658 -0.45346562 -0.3842268 ]]
截距: [0.19414681]
#略
4.引入GridSearchCV和sklearn.metrics后更完整的代码
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split,GridSearchCV#读入GridSearchCV包
from sklearn.metrics import roc_auc_score,roc_curve,precision_score,auc,precision_recall_curve,accuracy_score,recall_score,f1_score,confusion_matrix,classification_report#读入一些效果评估指标
#读入数据
breast_cancer=load_breast_cancer()
print(breast_cancer)
X=breast_cancer.data
y=breast_cancer.target
#分割数据集
X_train,X_test,Y_train,Y_test=train_test_split(X,y,test_size=0.3,random_state=0)
#标准化数据
ss=StandardScaler()
X_train=ss.fit_transform(X_train)#先划分测试集和训练集,再标准化训练集,测试集不需要标准化
#设置参数网格
param_grid = {'C': [0.01,0.1, 1, 10, 100, 1000,],'penalty': [ 'l1', 'l2']}
#设置网格搜索函数
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=10)
re = grid_search.fit(X_train,Y_train)
#找到最佳的参数和最佳的模型,并输出一些模型的结果
print(grid_search.best_params_)
best_model=grid_search.best_estimator_
print("参数:",best_model.coef_)
print("截距:",best_model.intercept_)
print(best_model.predict_proba(X_test))
#r_test=best_model.score(X_test,Y_test)输出的也是accuracy_score,但是要注意输入的参数不一样,而且只能输出accuracy这一个指标,不推荐使用
#输出评价指标
print('accuracy_score:',accuracy_score(Y_test,best_model.predict(X_test)))#输入的数值是实际数据和预测数据
print('roc_auc_score:',roc_auc_score(Y_test,best_model.predict(X_test)))
print('recall_score:',recall_score(Y_test,best_model.predict(X_test)))
print('precision_score:',precision_score(Y_test,best_model.predict(X_test)))
print(classification_report(Y_test, best_model.predict(X_test)))
#print("测试集准确率:",r_test)
5.GridSearchCV
官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV
调用方式及所有参数形式:
from sklearn.model_selection import GridSearchCV
class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None, iid=’warn’, refit=True, cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’, return_train_score=False)[source]
参数说明:
(1)estimator
选择使用的分类器,并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法:如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features=‘sqrt’,random_state=10),
(2)param_grid
需要最优化的参数的取值,值为字典或者列表,例如:param_grid=param_test1,param_test1 = {‘n_estimators’:range(10,71,10)}。
(3)scoring=None
模型评价标准,默认None,这时需要使用score函数;或者如scoring=‘roc_auc’,根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名形如:scorer(estimator, X, y);如果是None,则使用estimator的误差估计函数。具体值的选取看本篇第三节内容。
(4)fit_params=None
(5)n_jobs=1
n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值
(6)iid=True
iid:默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。
(7)refit=True
默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。
(8)cv=None
交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
输出属性说明:
(1)cv_results_ : dict of numpy (masked) ndarrays
具有键作为列标题和值作为列的dict,可以导入到DataFrame中。注意,“params”键用于存储所有参数候选项的参数设置列表。(下面是一个例子)
(2)best_estimator_ : estimator
通过搜索选择的估计器,即在左侧数据上给出最高分数(或指定的最小损失)的估计器。 如果refit = False,则不可用。
(3)best_score_ : float best_estimator的分数(这个score和前面参数设置的score保持一致)
(4)best_params_ : dict 在保存数据上给出最佳结果的参数设置
(5)best_index_ : int 对应于最佳候选参数设置的索引(cv_results_数组)。
6.sklearn.metrics
该模块提供了很多用于评价模型好坏的指标以及成对度量、复数、核函数部分的内容。度量指标主要有:
具体可参考官方文档:https://scikit-learn.org/stable/modules/classes.html#sklearn-metrics-metrics