sklearn 机器学习解题套路框架
前言
对于sklearn中的机器学习中大多可以分为以下5步
1 数据集的获取(处理)
2 数据集的预处理(规范化和降维)
3 数据集的拆分(用户评价模型)
4 模型的选择
5 模型的评价
1 整体模型框架
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WzHTOy10-1609035777056)(attachment:image.png)]
1.1 数据集获取:
skleran.datasets下常用的数据集
数据集的加载函数 数据集任务类型
load_boston 回归
fetch_california_housing 回归
load_digits 分类
load_breast_cancer 分类、聚类
load_iris 分类、聚类
load_wine 分类
使用形式:sklearn.datasets.数据集加载函数
eg:获取load_boston数据集
sklearn.datasets.load_boston
(注意数据集的一些属性特征,例如维度,标签等–可查询官方文档进行调用)
1.2 数据预处理:
1.2.1 数据集的规范化
sklearn.preprocessing下常用预处理函数
函数名称 说明
StandardScaler 对特征进行标准差标准化
Normalizer 对特征进行归一化
Binarizer 对定量特征进行二值化处理
OneHotEncoder 对定性特征进行独热编码处理
FunctionTransformer 对特征进行自定义函数变换
使用形式:
1 导入规范函数
2 生成规则
3 将规则作用与数据集
eg:由训练集生成离差标准化规则后,将规则作用与训练集和预测集
import numpy as np
from sklearn.preprocessing import MinMaxScaler
Scaler = MinMaxScaler().fit(cancer_data_train) ##生成规则
##将规则应用于训练集
cancer_trainScaler = Scaler.transform(cancer_data_train)
##将规则应用于测试集
cancer_testScaler = Scaler.transform(cancer_data_test)
1.2.2 数据集的降维
sklearn.decomposition下常用降维函数,一般使用PCA降维
PCA降维函数:
PCA(n_components=None【, *, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None】)
PCA降维函数中常用参数说明:
使用形式:
1) 调入函数(train_test_split)
2) 传入数据集和拆分比例
3) 拆分(注意拆分的返回)
eg:对数据集生成降维规则后,对数据进行降维
from sklearn.decomposition import PCA
pca_model = PCA(n_components=10).fit(cancer_trainScaler) ##生成规则
cancer_trainPca = pca_model.transform(cancer_trainScaler) ##将规则应用于训练集
cancer_testPca = pca_model.transform(cancer_testScaler) ##将规则应用于测试集
1.3 数据集的拆分
拆分训练集和测试集——用来模型的评分
拆分函数:
sklearn.model_selection.train_test_split(*arrays,**options)
参数说明:
*arrays 代表划分的数据集。聚类,则传入数据。分类回归,传入数据和标签
test_size 测试集集大小
train_size 训练集大小
random_state 接收int。代表随机种子
shuffle 默认True,表示是否放回抽样
stratify 接收array或者None。如果不为None,则使用传入的标签进行分层抽样
使用形式:
1) 调入函数(train_test_split)
2) 传入数据集和拆分比例
3) 拆分(注意拆分的返回)
eg:对分类数据集中的训练集和测试集进行拆分
from sklearn.model_selection import train_test_split
cancer_data_train, cancer_data_test,\
cancer_target_train, cancer_target_test = \
train_test_split(cancer_data, cancer_target,
test_size=0.2, random_state=42)
1.4 模型的选择
1.4.1 聚类——sklearn.cluter下提供的聚类方法
1.4.2 分类——大多分布在sklearn下的一级模块
1.4.3 回归——多分布在sklearn下的一级目录
1.5 模型评价
1.5.1 metrics下的聚类评价
1.5.2 metrics下的分类评价
1.5.3 metrics下的回归评价
2 K-Means聚类举例
# 1 获取数据
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
seeds = pd.read_csv('../data/seeds_dataset.txt',sep = '\t')
print('数据集形状为:', seeds.shape)
## 2 数据预处理
seeds_data = seeds.iloc[:,:7].values
seeds_target = seeds.iloc[:,7].values
sees_names = seeds.columns[:7]
stdScale = StandardScaler().fit(seeds_data)
seeds_dataScale = stdScale.transform(seeds_data)
## 3 构建并训练模型
kmeans = KMeans(n_clusters = 3,random_state=42).fit(seeds_data)
print('构建的KM-eans模型为:\n',kmeans)
# 4 模型的评价
from sklearn.metrics import calinski_harabaz_score
for i in range(2,7):
##构建并训练模型
kmeans = KMeans(n_clusters = i,random_state=12).fit(seeds_data)
score = calinski_harabaz_score(seeds_data,kmeans.labels_)
print('seeds数据聚%d类calinski_harabaz指数为:%f'%(i,score))
数据集形状为: (210, 8)
构建的KM-eans模型为:
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=42, tol=0.0001, verbose=0)
seeds数据聚2类calinski_harabaz指数为:351.179992
seeds数据聚3类calinski_harabaz指数为:375.804961
seeds数据聚4类calinski_harabaz指数为:327.835320
seeds数据聚5类calinski_harabaz指数为:310.331840
seeds数据聚6类calinski_harabaz指数为:302.473069
3 SVM分类模型举例
## 1 获取数据
import pandas as pd
from sklearn.svm import SVC
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
abalone = pd.read_csv('../data/abalone.data',sep=',')
## 2 数据预处理
# 将数据和标签拆开
abalone_data = abalone.iloc[:,:8]
abalone_target = abalone.iloc[:,8]
# 连续型特征离散化
sex = pd.get_dummies(abalone_data['sex'])
abalone_data = pd.concat([abalone_data,sex],axis = 1 )
abalone_data.drop('sex',axis = 1,inplace = True)
## 3 数据的划分
# 划分训练集,测试集
abalone_train,abalone_test, \
abalone_target_train,abalone_target_test = \
train_test_split(abalone_data,abalone_target,
train_size = 0.8,random_state = 42)
# 标准化
stdScaler = StandardScaler().fit(abalone_train)
abalone_std_train = stdScaler.transform(abalone_train)
abalone_std_test = stdScaler.transform(abalone_test)
## 4 模型选择并训练
# 建模
svm_abalone = SVC().fit(abalone_std_train,abalone_target_train)
print('建立的SVM模型为:','\n',svm_abalone)
## 5 模型的评价
abalone_target_pred = svm_abalone.predict(abalone_std_test)
print('abalone数据集的SVM分类报告为:\n',
classification_report(abalone_target_test,abalone_target_pred))
建立的SVM模型为:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
abalone数据集的SVM分类报告为:
precision recall f1-score support
3 0.00 0.00 0.00 3
4 0.45 0.69 0.55 13
5 0.54 0.22 0.31 32
6 0.40 0.33 0.36 48
7 0.41 0.44 0.42 84
8 0.37 0.36 0.37 99
9 0.28 0.57 0.38 142
10 0.24 0.33 0.28 139
11 0.25 0.25 0.25 93
12 0.00 0.00 0.00 51
13 0.00 0.00 0.00 31
14 0.00 0.00 0.00 26
15 0.00 0.00 0.00 21
16 0.00 0.00 0.00 13
17 0.00 0.00 0.00 8
18 0.00 0.00 0.00 12
19 0.00 0.00 0.00 7
20 0.00 0.00 0.00 4
21 0.00 0.00 0.00 3
22 0.00 0.00 0.00 3
23 0.00 0.00 0.00 4
accuracy 0.31 836
macro avg 0.14 0.15 0.14 836
weighted avg 0.25 0.31 0.26 836
4 Liner Regression回归举例
# 1 数据获取
import pandas as pd
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
house = pd.read_csv('../data/cal_housing.data',sep=',')
house_data = house.iloc[:,:-1]
house_target = house.iloc[:,-1]
house_names = ['longitude','latitude',
'housingMedianAge', 'totalRooms',
'totalBedrooms','population',
'households', 'medianIncome']
# 2 数据集的划分
house_train,house_test,house_target_train,house_target_test = \
train_test_split(house_data,house_target,
test_size = 0.2, random_state = 42)
# 3 模型选择并训练
GBR_house = GradientBoostingRegressor().fit(house_train,house_target_train)
print('建立的梯度提升回归模型为:','\n',GBR_house)
# 模型的评价
house_target_pred = GBR_house.predict(house_test)
from sklearn.metrics import explained_variance_score,\
mean_absolute_error,\
mean_squared_error,\
median_absolute_error,r2_score
print('california_housing数据梯度提升回归树模型的平均绝对误差为:',
mean_absolute_error(house_target_test,house_target_pred))
print('california_housing数据梯度提升回归树模型的均方误差为:',
mean_squared_error(house_target_test,house_target_pred))
print('california_housing数据梯度提升回归树模型的中值绝对误差为:',
median_absolute_error(house_target_test,house_target_pred))
print('california_housing数据梯度提升回归树模型的可解释方差值为:',
explained_variance_score(house_target_test,
house_target_pred))
print('california_housing数据梯度提升回归树模型的R方值为:',
r2_score(house_target_test,house_target_pred))
建立的梯度提升回归模型为:
GradientBoostingRegressor(alpha=0.9, criterion='friedman_mse', init=None,
learning_rate=0.1, loss='ls', max_depth=3,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100,
n_iter_no_change=None, presort='auto',
random_state=None, subsample=1.0, tol=0.0001,
validation_fraction=0.1, verbose=0, warm_start=False)
california_housing数据梯度提升回归树模型的平均绝对误差为: 38055.14120724933
california_housing数据梯度提升回归树模型的均方误差为: 3103158196.172548
california_housing数据梯度提升回归树模型的中值绝对误差为: 26179.478445698216
california_housing数据梯度提升回归树模型的可解释方差值为: 0.7619005663157657
california_housing数据梯度提升回归树模型的R方值为: 0.7618531003377986