数据集加载函数 | 数据集任务类型 |
---|---|
load_ boston | 回归 |
fetch_california_housing | 回归 |
load_digits | 分类 |
load_wine | 分类 |
load_breast_cancer | 分类,聚类 |
load_iris | 分类,聚类 |
from sklearn.datasets import load_boston
data = load_boston()
(1)查看键值对:
data.keys()
dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])
(2)查看数据:
data['data']
array([[6.3200e-03, 1.8000e+01, 2.3100e+00, ..., 1.5300e+01, 3.9690e+02,
4.9800e+00],
[2.7310e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9690e+02,
9.1400e+00],
[2.7290e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9283e+02,
4.0300e+00],
...,
[6.0760e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02,
5.6400e+00],
[1.0959e-01, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9345e+02,
6.4800e+00],
[4.7410e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02,
7.8800e+00]])
from sklearn.model_selection import train_test_split
# 分别返回这四个值:train_data,test_data,train_target,test_target
#取20%作为测试集和训练集
train_test_split(data['data'], data['target'], test_size=0.2)
[array([[4.15292e+01, 0.00000e+00, 1.81000e+01, ..., 2.02000e+01,
3.29460e+02, 2.73800e+01],
...,
[8.05579e+00, 0.00000e+00, 1.81000e+01, ..., 2.02000e+01,
3.52580e+02, 1.81400e+01],
array([[1.7090e-02, 9.0000e+01, 2.0200e+00, ..., 1.7000e+01, 3.8446e+02,
4.5000e+00],
...,
[2.7290e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9283e+02,
4.0300e+00]]),
array([ 8.5, 17.5, 24.3, 24.8, 24.1, 22.3, 16.5, 19.4, 46. , 15.6, 14.3,
33.2, 11. , 44.8, 19.1, 24.8, 50. , 5.6, 15.6, 23. , 22.6, 31.7,
...,
13.3, 19.4, 50. , 21.2, 13.1, 20.6, 23.1, 24.8, 11.8, 21.4, 34.9,
15. , 13.1, 23.9, 19.4, 13.9, 13.8, 14.9, 23.9]),
array([30.1, 24.3, 34.6, 10.4, 15.7, 16.2, 14.1, 22.9, 21.1, 19.5, 18.5,
27.9, 28.7, 20.8, 14.1, 28.7, 19.6, 20.4, 43.1, 31.1, 15.4, 18. ,
...,
20.6, 10.5, 22.8, 18.8, 25. , 25.3, 50. , 13.8, 37. , 18.3, 23.9,
11.9, 23.3, 34.7])]
方法名称 | 说明 |
---|---|
fit | fit方法主要通过分析特征和目标值,提取有价值的信息,这些信息可以是统计量,也可以是权值系数等 |
transform | transform方法主要用来对特征进行转换。从可利用信息的角度可分为无信息转换和有信息转换。无信息转换是指不利用任何其他信息进行转换,比如指数和对数函数转换等。有信息转换根据是否利用目标值向量又可分为无监督转换和有监督转换。无监督转换指只利用特征的统计信息的转换,比如标准化和PCA降维等。有监督转换指既利用了特征信息又利用了目标值信息的转换,比如通过模型选择特征和LDA降维等 |
fit_transform | fit_transform方法就是先调用fit方法,然后调用transform方法 |
train_data,test_data,train_target,test_target = train_test_split(data['data'], data['target'], test_size=0.2)
from sklearn.preprocessing import MinMaxScaler
model = MinMaxScaler().fit(train_data)
train_data_mms = model.transform(train_data)
test_data_mms = model.transform(test_data)
model.min_
array([-7.10352762e-05, 0.00000000e+00, -2.74074074e-02, 0.00000000e+00,
-7.92181070e-01, -6.89581720e-01, -2.98661174e-02, -1.02719857e-01,
-4.34782609e-02, -3.56870229e-01, -1.34042553e+00, -6.38977636e-03,
-4.77373068e-02])
函数名称 | 说明 |
---|---|
MinMaxScaler | 对特征进行离差标准化 |
StandardScaler | 对特征进行标准差标准化 |
Normalizer | 对特征进行归一化 |
Binarizer | 对定量特征进行二值化处理 |
OneHotEncoder | 对定性特征进行独热编码处理 |
FunctionTransformer | 对特征进行自定义函数变换 |
from sklearn.decomposition import PCA
model = PCA(n_components=8).fit(train_data_mms)
model.transform(train_data_mms).shape
函数名称 | 说明 |
---|---|
n_components | 接收None,int,float或string。未指定时,代表所有特征均会被保留下来;如果为int,则表示将原始数据降低到n个维度;如果为float,同时svd_solver参数等于full;赋值为string,比如n_components=‘mle’,将自动选取特征个数n,使得满足所要求的方差百分比。默认为None |
copy | 接收bool。代表是否在运行算法时将原始数据复制一份,如果为True,则运行后,原始数据的值不会有任何改变;如果为False,则运行PCA算法后,原始训练数据的值会发生改变。默认为True |
whiten | 接收boolean。表示白化,所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1。默认为False |
svd_solver | 接收string {‘auto’, ‘full’, ‘arpack’, ‘randomized’}。代表使用的SVD算法。randomized一般适用于数据量大,数据维度多,同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。full是使用SciPy库实现的传统SVD算法。arpack和randomized的适用场景类似,区别是randomized使用的是sklearn自己的SVD实现,而arpack直接使用了SciPy库的sparse SVD实现。auto则代表PCA类会自动在上述三种算法中去权衡,选择一个合适的SVD算法来降维。默认为auto |
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
data = load_iris()
data.keys()
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
(2)降维聚类
model = KMeans(n_clusters=3).fit(data['data'])
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
(3)查看聚类标签
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0,
0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0,
0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2])
(4)聚类中心
model.cluster_centers_
array([[6.85 , 3.07368421, 5.74210526, 2.07105263],
[5.006 , 3.428 , 1.462 , 0.246 ],
[5.9016129 , 2.7483871 , 4.39354839, 1.43387097]])
(5) 查看聚类效果
import matplotlib.pyplot as plt
for i in range(3):
plt.scatter(data['data'][model.labels_ == i, 0], data['data'][model.labels_ == i, 1])
plt.show()
算法类别 | 包括的主要算法 |
---|---|
划分(分裂)方法 | K-Means算法(K-平均),K-MEDOIDS算法(K-中心点)和CLARANS算法(基于选择的算法) |
层次分析方法 | BIRCH算法(平衡迭代规约和聚类),CURE算法(代表点聚类)和CHAMELEON算法(动态模型) |
基于密度的方法 | DBSCAN算法(基于高密度连接区域),DENCLUE算法(密度分布函数)和OPTICS算法(对象排序识别) |
基于网格的方法 | STING算法(统计信息网络),CLIOUE算法(聚类高维空间)和WAVE-CLUSTER算法(小波变换) |
参数名称 | 参数 | 适用范围 | 距离度量 |
---|---|---|---|
KMeans | 簇数 | 可用于样本数目很大,聚类数目中等的场景 | 点之间的距离 |
Spectral clustering | 簇数 | 可用于样本数目中等,聚类数目较小的场景 | 图距离 |
Ward hierarchical clustering | 簇数 | 可用于样本数目较大,聚类数目较大的场景 | 点之间的距离 |
Agglomerative clustering | 簇数,链接类型,距离 | 可用于样本数目较大,聚类数目较大的场景 | 任意成对点线图间的距离 |
DBSCAN | 半径大小,最低成员数目 | 可用于样本数目很大,聚类数目中等的场景 | 最近的点之间的距离 |
Birch | 分支因子,阈值,可选全局集群 | 可用于样本数目很大,聚类数目较大的场景 | 点之间的欧式距离 |
方法名称 | 说明 |
---|---|
fit | fit方法主要用于训练算法。该方法可接收用于有监督学习的训练集及其标签两个参数,也可以接收用于无监督学习的数据 |
predict | predict用于预测有监督学习的测试集标签,亦可以用于划分传入数据的类别 |
方法名称 | 真实值 | 最佳值 | sklearn函数 |
---|---|---|---|
ARI评价法(兰德系数) | 需要 | 1.0 | adjusted_rand_score |
AMI评价法(互信息) | 需要 | 1.0 | adjusted_mutual_info_score |
V-measure评分 | 需要 | 1.0 | completeness_score |
FMI评价法 | 需要 | 1.0 | fowlkes_mallows_score |
轮廓系数评价法 | 不需要 | 畸变程度最大 | silhouette_score |
Calinski-Harabasz指数评价法 | 不需要 | 相较最大 | calinski_harabaz_score |
from sklearn.metrics import silhouette_score
for k in range(2,9):#聚类必须要两类以上
model = KMeans(n_clusters=k).fit(data['data'])
print (k, silhouette_score(data['data'], model.labels_))
2 0.681046169211746
3 0.5528190123564091
4 0.4980505049972867
5 0.4887488870931048
6 0.3678464984712235
7 0.34974797998286666
8 0.3519340715227998
模块名称 | 函数名称 | 算法名称 |
---|---|---|
linear_model | LogisticRegression | 逻辑斯蒂回归 |
svm | SVC | 支持向量机 |
neighbors | KNeighborsClassifier | K最近邻分类 |
naive_bayes | GaussianNB | 高斯朴素贝叶斯 |
tree | DecisionTreeClassifier | 分类决策树 |
ensemble | RandomForestClassifier | 随机森林分类 |
ensemble | GradientBoostingClassifier | 梯度提升分类树 |
(1) 导入乳腺癌数据
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
data.keys()
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
(2) 切分训练集和测试集
from sklearn.model_selection import train_test_split
x = data['data']
y = data['target']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
import numpy as np
a = x_train.max(axis=0)
b = np.int32(a)
print (a)
print (b)
[2.742e+01 3.381e+01 1.869e+02 2.501e+03 1.447e-01 3.454e-01 4.268e-01
2.012e-01 3.040e-01 9.744e-02 2.547e+00 4.885e+00 1.865e+01 5.422e+02
3.113e-02 1.354e-01 3.038e-01 4.090e-02 7.895e-02 1.792e-02 3.604e+01
4.954e+01 2.512e+02 4.254e+03 2.184e-01 1.058e+00 1.252e+00 2.910e-01
6.638e-01 2.075e-01]
[ 27 33 186 2501 0 0 0 0 0 0 2 4 18 542
0 0 0 0 0 0 36 49 251 4254 0 1 1 0
0 0]
(5)模型预处理
from sklearn.preprocessing import StandardScaler#标准化处理
model = StandardScaler().fit(x_train)#转化器
x_train_ss = model.transform(x_train)#数据转换
x_test_ss = model.transform(x_test)
x_train_ss.max(axis=0)
array([ 3.75279933, 3.40078459, 3.87612308, 5.22160261, 3.47708666,
4.46981795, 4.23702302, 3.86941019, 4.32316651, 5.17184343,
8.08552814, 6.46636386, 8.20460134, 11.59481831, 7.99107585,
6.19064439, 10.06666234, 4.79952833, 6.94486675, 6.79949363,
4.04728935, 3.8607151 , 4.23197577, 5.78700996, 3.76910474,
4.91271971, 4.65125398, 2.63951827, 5.7811745 , 6.88724735])
(6)分类模型构建
#分类模型构建
from sklearn.svm import SVC
model = SVC().fit(x_train_ss, y_train)#SVC估计器,对模型进行训练
model.predict(x_test_ss)#用测试集来预测模型
array([1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1,
0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1,
1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0,
1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 1, 1])
model.score(x_test_ss,y_test)
0.9473684210526315
方法名称 | 最佳值 | sklearn函数 |
---|---|---|
Precision(精确率) | 1.0 | metrics.precision_score |
Recall(召回率) | 1.0 | metrics.recall_score |
F1值 | 1.0 | metrics.f1_score |
Cohen’s Kappa系数 | 1.0 | metrics.cohen_kappa_score |
ROC曲线 | 最靠近y轴 | metrics. roc_curve |
from sklearn.metrics import recall_score, precision_score, f1_score, roc_curve
y_pre = model.predict(x_test_ss)#用测试集来预测模型
print ('召回率:',recall_score(y_test, y_pre)) #召回率
print ('准确率:',precision_score(y_test, y_pre))#准确率
print ('F1值:',f1_score(y_test, y_pre))#F1值
召回率: 0.9746835443037974
准确率: 1.0
F1值: 0.9871794871794872
fpr, tpr, thresholds = roc_curve(y_test, y_pre)#返回的值分别为假证率,真证率,预计值
import matplotlib.pyplot as plt
plt.plot(fpr, tpr)
plt.show()
回归模型名称 | 适用条件 | 算法描述 |
---|---|---|
线性回归 | 因变量与自变量是线性关系 | 对一个或多个自变量和因变量之间的线性关系进行建模,可用最小二乘法求解模型系数 |
非线性回归 | 因变量与自变量之间不都是线性关系 | 对一个或多个自变量和因变量之间的非线性关系进行建模。如果非线性关系可以通过简单的函数变换转化成线性关系,用线性回归的思想求解;如果不能转化,用非线性最小二乘方法求解 |
Logistic回归 | 因变量一般有1和0(是与否)两种取值 | 是广义线性回归模型的特例,利用Logistic函数将因变量的取值范围控制在0和1之间,表示取值为1的概率 |
岭回归 | 参与建模的自变量之间具有多重共线性 | 是一种改进最小二乘估计的方法 |
主成分回归 | 参与建模的自变量之间具有多重共线性 | 主成分回归是根据主成分分析的思想提出来的,是对最小二乘法的一种改进,它是参数估计的一种有偏估计。可以消除自变量之间的多重共线性 |
模块名称 | 函数名称 | 算法名称 |
---|---|---|
linear_model | LinearRegression | 线性回归 |
svm | SVC | 支持向量机 |
neighbors | KNeighborsRegressor | 最近邻回归 |
tree | DecisionTreeRegressor | 回归决策树 |
ensemble | RandomForestClassifier | 随机森林分类 |
ensemble | GradientBoostingClassifier | 梯度提升分类树 |
(1)导入数据
from sklearn.datasets import load_boston
data = load_boston()
x = data['data']
y = data['target']
(2)用训练集拟合回归方差
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
(3)用训练集建模
from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(x_train, y_train)
(4)预测值
y_pre = model.predict(x_test)
(5)绘制折线图
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
plt.plot(range(len(y_test)), y_test)
plt.plot(range(len(y_pre)), y_pre)
plt.legend(['real','predict'])
plt.show()
方法名称 | 最优值 | sklearn函数 |
---|---|---|
平均绝对误差 | 0.0 | metrics. mean_absolute_error |
均方误差 | 0.0 | metrics. mean_squared_error |
中值绝对误差 | 0.0 | metrics. median_absolute_error |
可解释方差值 | 1.0 | metrics. explained_variance_score |
R方值 | 1.0 | metrics. r2_score |
from sklearn.metrics import mean_squared_error,r2_score#均方误差,R方值
print ('均方误差:',mean_squared_error(y_true=y_test, y_pred=y_pre))#越接近0越好
print ('R方差:',r2_score(y_true=y_test, y_pred=y_pre))
均方误差: 19.027472855809343
R方差: 0.7606396627204572