目录
[K折交叉验证(K-Fold Cross Validation)](#K折交叉验证(K-Fold Cross Validation))
[留一交叉验证(Leave-One-Out Cross Validation, LOO-CV)](#留一交叉验证(Leave-One-Out Cross Validation, LOO-CV))
[分层K折交叉验证(Stratified K-Fold Cross Validation)](#分层K折交叉验证(Stratified K-Fold Cross Validation))
[时间序列交叉验证(Time Series Split)](#时间序列交叉验证(Time Series Split))
基本概念
机器学习概念与过程
直观上理解,机器学习(Machine Learning,ML)是研究计算机模拟人类的学习活动,获取知识和技能的理论和方法,改善系统性能的学科。
因为计算机系统中"经验'通常以数据的形式存在,所以机器要利用经验,就必须对数据进行分析。因此其过程可以简述如下:
建立模型 :设计计算机可以自动"学习"的算法
训练 :用数据训练算法模型(算法从数据中分析规律)
预测:利用训练后的算法完成任务(根据学习的规律为未知数据进行分类和预测)
机器学习的分类
学习任务
按学习任务分类,主要包括分类、回归、聚类、降维等,这里只对分类与回归作区分,其他的通过字面理解就行
分类与回归区分
连续变量的预测-->回归问题
- 预测房价、股票、明天气温
离散变量的预测-->分类问题
- 上不上课(上课或不上课);是否佩戴眼睛(散光、不散光)--二分类问题
- 图像识别(识别图像中的动物种类)--多分类问题
- 音乐推荐(一首歌曲可能同时属于多个流派)--多标签分类问题
学习方式
按学习方式分类,包括有监督学习、无监督学习、半监督学习、强化学习
人工智能导论(6)------机器学习(Machine Learning)_机器学习 人工智能导论-CSDN博客
不平衡分类模型
什么是不平衡分类
这种举例子就懂了,例如根据体检数据判断是否患病,那根据常识,不患病的人肯定说远多于患病人数;例如检测欺诈性信用卡交易。如下图所示,欺诈性交易约为400笔,而非欺诈性交易为约90000笔。
如果对于这种不平衡模型之间进行训练,你会发现调到最后,预测出不患病的准确率接近百分百,预测患病的准确率为0,这显然是不行的
通过重采样进行解决
用于处理高度不平衡数据集的一种广泛采用的类不平衡技术称为重采样 。它包括从多数类中删除样本(欠采样)和/或从少数类中添加更多样本(过采样)。
下采样的优点和缺点
优点:
- 当训练数据集很大时,它可以通过减少训练数据样本的数量来帮助改善运行时间和存储问题。
缺点:
- 它++可能会丢弃可能对构建规则分类器很重要的潜在有用信息。++
- 通过随机欠采样选择的样本可以是偏置样本。而且这并不能准确地代表整体情况。从而导致实际测试数据集的结果不准确。
过采样的优点和缺点
优点:
- 与欠采样(under-sampling)不同,过采样不会导致信息丢失。
- 性能优于下采样。
缺点:
- 由于它复制了少数类事件,因此++增加了过拟合的可能性++。
方法有多种,参考机器学习中解决不平衡分类的10种技术_类平衡技术-CSDN博客,不一一列举,根据具体情况进行使用
交叉验证
what
在建立模型时,分为两个数据集------训练集和测试集,训练集是用来训练模型,测试集就是字面理解,用于测试,不参与模型训练,只用于看模型训练效果
常常会出现,在训练集的预测效果很好,而到测试集就不太理想
训练的模型需要找出数据之间'真正'的关系,避免'过拟合'的情况发生。
过拟合
过拟合是指训练误差和测试误差之间的差距太大。换句换说,就是模型复杂度高于实际问题,++模型在训练集上表现很好,但在测试集上却表现很差++ 。模型对训练集"死记硬背"(记住了不适用于测试集的训练集性质或特点),没有理解数据背后的规律,泛化能力差。
交叉验证 :就是在训练集中选一部分样本用于测试模型,++保留一部分的训练集数据作为验证集/评估集++ ,对训练集生成的参数进行测试,++相对客观的判断这些参数对训练集之外的数据的符合程度。++
常见方法
K折交叉验证(K-Fold Cross Validation)
将数据集分为K个大小相等的子集,++轮流选择K-1个子集作为训练集,余下的一个子集作为验证集,进行K次训练和验证++,最后计算平均性能指标.
如何确定K值?
- 一般情况下3、5是默认选项,常建议用K=10。
- k值越低,就越有偏差;K值越高偏差就越小,但是会受到很大的变化。
- k值越小,就越类似于验证集方法;而k值越大,则越接近LOOCV方法。
简单代码(用于理解过程)
python
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 创建模型
model = LogisticRegression()
# 进行5折交叉验证
scores = cross_val_score(model, X, y, cv=5)
# 输出每次交叉验证的得分
print("每次交叉验证的得分:", scores)
# 计算平均得分
average_score = scores.mean()
print("平均得分:", average_score)
留一交叉验证(Leave-One-Out Cross Validation, LOO-CV)
是K折交叉验证的一个特例,每次使用一个样本作为验证集,其他样本作为训练集,++适用于小数据集.++
分层K折交叉验证(Stratified K-Fold Cross Validation)
分层是重新将数据排列组合,使得每一折都能比较好地代表整体。适用于分类问题,确保每个子集中各类别的比例与原始数据集中相同.
时间序列交叉验证(Time Series Split)
适用于时间序列数据,确保训练集只包含时间序列之前的数据,验证集包含之后的数据.
代码
以下附上实战代码,旨在了解模型预测过程
python
# # 第四章 逻辑回归模型 - 股票客户流失预警模型
# # 案例实战 - 股票客户流失预警模型
# 1.读取数据
import pandas as pd
import sklearn.model_selection as ms
import sklearn.naive_bayes as nb
df = pd.read_excel('股票客户流失.xlsx')
df.head()
# 2.划分特征变量和目标变量
X = df.drop(columns='是否流失')
y = df['是否流失']
# 3.划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42) # 设置random_state使得每次划分的数据一样
# 模型一 逻辑回归
# 网格调参
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 创建逻辑回归模型
# 定义要搜索的参数网格
param_grid = {
'C': np.logspace(-4, 4, 20), # 正则化强度参数C
'penalty': ['l1', 'l2'], # 惩罚类型
'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'], # 解算器
'max_iter': [100, 500, 1000]
}
# 创建逻辑回归模型
lr = LogisticRegression(max_iter=1000, random_state=42)
# 创建网格搜索对象
grid_search = GridSearchCV(estimator=lr, param_grid=param_grid, cv=10, n_jobs=-1, scoring='accuracy')
# 拟合网格搜索对象
grid_search.fit(X_train, y_train)
# 输出最佳参数组合
print("最佳参数组合:", grid_search.best_params_)
# 使用最佳参数重新训练模型
best_lr = grid_search.best_estimator_
# 在测试集上评估模型性能(可选)
y_pred = best_lr.predict(X)
accuracy = accuracy_score(y, y_pred)
precision = precision_score(y, y_pred, average='macro')
recall = recall_score(y, y_pred, average='macro')
f1 = f1_score(y, y_pred, average='macro')
print("准确率:", accuracy)
print("精确率:", precision)
print("召回率:", recall)
print("F1分数:", f1)
# # 模型二 朴素贝叶斯
# model = nb.GaussianNB()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('朴素贝叶斯',score)
# # 模型三 决策树
# from sklearn.tree import DecisionTreeClassifier
# model = DecisionTreeClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('决策树',score)
# # 模型四 随机森林
# from sklearn.ensemble import RandomForestClassifier
# model = RandomForestClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('随机森林',score)
# # 模型五 KNN
# from sklearn.neighbors import KNeighborsClassifier
# model = KNeighborsClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('KNN',score)
# # 模型六 SVM
# from sklearn.svm import SVC
# model = SVC()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('SVM',score)
# # 模型七 XGBoost
# from xgboost import XGBClassifier
# model = XGBClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('XGBoost',score)
# # 模型八 LightGBM
# from lightgbm import LGBMClassifier
# model = LGBMClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('LightGBM',score)
# # 模型九 CatBoost
# from catboost import CatBoostClassifier
# model = CatBoostClassifier()
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('CatBoost',score)
# # 模型十 集成学习
# from sklearn.ensemble import VotingClassifier
# model = VotingClassifier(estimators=[('lr', model), ('nb', model), ('dt', model), ('rf', model), ('knn', model), ('svm', model), ('xgb', model), ('lgb', model), ('cb', model)], voting='hard')
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('集成学习',score)
# # 模型十一 模型融合
# from sklearn.ensemble import StackingClassifier
# model = StackingClassifier(estimators=[('lr', model), ('nb', model), ('dt', model), ('rf', model), ('knn', model), ('svm', model), ('xgb', model), ('lgb', model), ('cb', model)], final_estimator=model)
# model.fit(X_train, y_train)
# y_pred = model.predict(X_test)
# score = accuracy_score(y_pred, y_test)
# print('模型融合',score)