原始机器学习框架整合
- 按题目要求选取算法
- 加载数据
- 数据预处理
- 根据经验设置参数建立模型并训练
- 根据训练结果返回调节参数
- 输出模型评价指标
机器学习框架进阶版
- 不指定算法的情况下,根据经验选几个可能的算法
- 加载数据
- 数据预处理
- 选取小规模数据使用交叉验证对上述几个可能算法进行评估比较,选出最适合的算法
- 使用表格搜索对最优算法交叉验证,获得模型的最优参数
- 使用最优参数建立模型
- 使用管道机制将数据处理,降维,最优模型等模块进行封装
- 将数据传入管道训练,打印输出各项指标
- 将管道模型保存至本地,可以循环使用
以脑瘤数据集为例整合代码如下
'''
导包的时候不要着急,不要强行记忆,用到什么导入什么即可
'''
# 当需要对矩阵求平均值的时候,导入numpy
import numpy as np
# 当加载数据的时候,导入语pandas
import pandas as pd
# 当警告过多的时候,导入warnings来忽略警告
import warnings
# 当数据需要标准化处理的时候,导入标准化函数
from sklearn.preprocessing import StandardScaler
# 当需要降维的时候,导入pca降维算法
from sklearn.decomposition import PCA
# 当需要建立逻辑回归模型的时候,导入LogisticRegression
from sklearn.linear_model import LogisticRegression
# 当需要建立决策树分类树模型的时候,导入DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
# 当需要对数据集进行切割,表格搜索,交叉验证的时候,导入cross_val_score,GridSearchCV,train_test_split
from sklearn.model_selection import cross_val_score,GridSearchCV,train_test_split
# 当需要建立支持向量机的分类模型的时候,导入SVC
from sklearn.svm import SVC
# 当需要对模快进行封装的时候,导入Pipeline
from sklearn.pipeline import Pipeline
# 当需要各项评价指标的时候,导入roc_auc_score,roc_curve等,还有混淆矩阵,分类报告等
from sklearn.metrics import roc_auc_score,roc_curve
# 当需要画图的时候,导入pyplot
from matplotlib import pyplot as plt
# 当需要保存模型的时候,导入joblib
from sklearn.externals import joblib
# 忽略过多的警告
warnings.filterwarnings('ignore')
# 加载数据
df = pd.read_excel(r'../datas/naoliu.xls')
# 显示尽可能多的列数
pd.set_option('display.max_columns',20)
# 显示尽可能多的行数
pd.set_option('display.max_rows',200)
# print(df.columns)
# print(df.head())
# 删除带有缺失值的样本,删除无用的列
df.drop(columns=['Unnamed: 0'],inplace=True)
df.dropna(inplace=True)
# print(df.head())
# 提取小样本作为训练样本
df_small = df.sample(500)
# print(df_small.head())
# 数据提取
X = df_small.iloc[:,:-1]
y = df_small.iloc[:,-1]
# 数据标准化
X = StandardScaler().fit_transform(X)
# 降至2维
model_pca = PCA(n_components=3)
X = model_pca.fit_transform(X)
# 交叉验证比较逻辑回归,SVM和决策树哪个算法会更好的拟合数据 用f1值做评价指标,cv=10
LR = LogisticRegression(max_iter=2000)
DT = DecisionTreeClassifier()
SVM = SVC(kernel='linear',max_iter=2000)
LR_f1 = cross_val_score(LR,X,y,scoring='f1',cv=10)
DT_f1 = cross_val_score(DT,X,y,scoring='f1',cv=10)
SVM_f1 = cross_val_score(SVM,X,y,scoring='f1',cv=10)
print('LR,f1指标是:',np.mean(LR_f1))
print('SVM,f1指标是:',np.mean(SVM_f1))
print('DT,f1指标是:', np.mean(DT_f1))
# 选择出较好的算法 用表格搜索调节找到最优的参数cv=10 经过比较,SVM效果更好
# 设置参数集
params = {
'C':[0.1,0.3,0.03,1,3,5,10,13,30,50,100,500,1000],
'kernel':['rbf','linear','sigmoid'],
'max_iter':[500,1000,2000,5000,10000]
}
# 表格搜索会穷举参数集的各种组合,选择出最优的那一组参数
model_nice = GridSearchCV(SVM,param_grid=params).fit(X,y)
best_score = model_nice.best_params_
print(best_score)
# 用管道封装最优参数的模型
model_pip = Pipeline([
('ss',StandardScaler()),
('pca',PCA(n_components=3)),
('svm',SVC(C=best_score.get('C'),kernel=best_score.get('kernel'),max_iter=best_score.get('max_iter'),probability=True))
])
# 将整体样本切分为训练集和测试集
X = df.iloc[:,:-1]
y = df.iloc[:,-1]
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)
# 训练集训练
model_pip.fit(X_train,y_train)
pred = model_pip.predict(X_test)
preds = model_pip.predict_proba(X_test)
# 测试集测试
print(model_pip.score(X_test,y_test))
print(model_pip.score(X_train,y_train))
# 评价指标 打印准确率,混淆矩阵和分类报告,打印auc值,画出roc曲线。
AUC = roc_auc_score(y_test,preds[:,-1])
print(AUC)
TPR,FPR,TH = roc_curve(y_test,preds[:,-1])
# 画图
# 设置中文字体和负号正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title('ROC曲线')
plt.plot(TPR,FPR)
plt.show()
# 保存模型
joblib.dump(model_pip,filename='naoliu.model')
效果如下
加载保存好的模型用于工业预测
import pandas as pd
import warnings
from sklearn.externals import joblib
# 忽略警告
warnings.filterwarnings('ignore')
# 读取数据
df = pd.read_excel(r'../datas/naoliu.xls')
df.drop(columns=['Unnamed: 0'],inplace=True)
df.dropna(inplace=True)
# 提取数据
X = df.iloc[:,:-1]
y = df.iloc[:,-1]
# 加载保存好的模型
model = joblib.load(filename='naoliu.model')
# 输出预测准确率(可以直接拿来使用)
print(model.score(X, y))
# 预测准确率
>>0.8457831325301205