Traditional_machine_learning_tutorial

sklearn的基本概念

#4大核心组件

数据预处理

1. 数据清洗和转换

2. 数据拆分与采样

3. 特征选择与降维

核心目标:消除数据噪声、统一特征尺度、提升模型收敛、避免维度灾难,让数据满足模型输入需求。

建模(Model)

1. 监督学习

分类(目标位离散值)

回归(目标位连续值)

2. 无监督学习

聚类

异常检测:

关联规则apriori(关联规则挖掘,需结合mlxtend)

3. 半监督学习

半监督分类

核心特征: 所有模型都遵循以下的规则:

模型评估

核心指标:量化模型性能,判断模型泛化能力,避免过拟合/欠拟合

1. 评估指标

分类指标

回归指标

聚类指标:

2. 交叉验证与网格搜索

交叉验证:

超参数调优:

3.模型验证工具

客观衡量模型性能,指导模型调优,确保模型在新数据上的有效性

模型管道 (Pipeline):串联预处理、训练、评估流程,避免数据泄露,简化代码

1.基础管道 pipline

按照顺序执行多个步骤,前序输出作为后续输入。

2.进阶管道ColumnTransformer

针对不同特征应用不同预处理逻辑(如数值列标准化、类别列独热编码)

3.管道与网格搜索结合

支持对管道内所有步骤的超参数调优


数据集格式要求(X,y) 注意是大写的X,小写的y

1.特征矩阵X

特征矩阵需要是二维数组或类数组。比如array或DataFrame

维度的定义: X.shape = (n_samples,n_fetures)

数据类型:

这里是示例,X_np.shape有2行3列,即代表有2个样本,3个特征值。

X_df这里就很明显了,因为输入的时候有列名,所以很明显就知道是3行2列。3行代表3个样本(此处是不同的人)。

2.目标变量y

目标变量的特征

Estimator(估计器)

Estimator是sklearn所有模型的基类,所有算法(逻辑回归,标准化,PCA)都实现了一套完全统一的核心方法

方法 核心作用 适用场景
fit(X,y) 拟合数据,学习数据中的模式 所有的Estimator
predict(X) 用拟合好的模型预测新数据 监督学习(分类、回归)、聚类
score() 评估模型性能(返回得分) 监督学习、聚类
from sklearn.linear_model import LogisticsRegression

#初始化Estimator(可设置超参数)
model=LogisticsRegression(C=0.1,random_state=42)

# 用训练数据拟合模型(核心、学习参数)
model.fit(X_train,y_train)

#predict()用拟合好的模型预测新数据
y_pred = model.predict(X_test) #预测测试集的结果

#score()评估模型(默认是准确率,回归是R2)
accuracy = model.score(X_test,y_test) #对比测试集的真实值和预测值,返回得分

流水线的基本用法

from sklearn.pipline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticsRegression
from sklearn.model_selection import train_test_split
#1.拆分数据(拆分出训练集,测试集,训练的目标值,测试集的目标值)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=100)
#2.定义流水线
pipe=Pipeline([
	('scaler',StandardScaler()), #步骤1预处理
	('clf',LogisticsRegression()) #步骤2 模型
])
#3.训练流水线
pipe.fit(X_train,y_train)
#4.预测、评估
y_pred=pipe.predict(X_test)
score=pipe.score(X_test,y_test)

多类型特征处理

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

#定义不同的列的预处理规则
preprocessor = ColumnTransformer([
	('num',StandardScaler(),['age','income']),#数值类的标准化
	('cat',OneHotEncoder(),['gender','city']) #类别列:独热编码
])

#完整流水线
full_pipe=Pipeline([
	('preprocess',preprocessor),
	('clf',LogisticsRegression())
])

full_pipe.fit(X_train,y_train)

一个完整的分析建模的示例:

#1.导入所需的模块
import sklearn
from sklearn.datasets import load_iris #内置的数据集
from sklearn.model_selection import train_test_split #数据分割模型
from sklearn.ensemble import RandomForestClassifier #使用随机森林分类模型
from sklearn.metrics import accuracy_score #评估指标
import matplotlib.pyplot as plt #绘图模块
#2.加载并查看数据
iris =load_iris()
X=iris.data

# 3.分割训练集(80%)和测试集(20%)
#实际使用时,需要分为训练集70%,测试集20%,验证集10%或者是7:1.5:1.5这个比例。
random_state=100 #固定随机数种子
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=100)

# 4.训练随机森林模型 (使用100个决策树)
#设置使用的模型和超参数 
model=RandomForestClassifier(n_estimators=100,random_state=100) 

#用训练集训练
model.fit(X_train,y_train)


# 5.预测与评估
#使用测试集预测
y_pred = model.predict(X_test) 

#使用y测试集的真实值和预测值相比计算准确率
accuracy = accuracy_score(y_test,y_pred)
#输出准确率,保留3为小数
print(f"{accuracy:.3f}") 

# 6.可视化预测的结果
from sklearn.metrics import (confusion_matrix,classification_report,
accuracy_score,roc_curve,auc,precision_recall_curve)



#可视化模型的结果
from sklearn.metrics import (confusion_matrix,classification_report,
accuracy_score,roc_curve,auc,precision_recall_curve)
import seaborn as sns
import pandas as pd
#计算混淆矩阵
cm = confusion_matrix(y_test,y_pred)

#可视化混淆矩阵
plt.figure(figsize=(8,6))
sns.heatmap(cm,
           annot=True,fmt='d',cmap='Blues')
plt.xlabel('True Value')
plt.ylabel('Predict Value')
plt.title('confusion matrix')
plt.show()
#混淆矩阵中,对角线上的数值越大(颜色越浓),不在对角线上的值越小说明模型越好


#打印出不要类别的预测准确率,召回率,F1得分
print(classification_report(y_test,y_pred))

report = classification_report(y_test,y_pred,output_dict=True)
metrics = ['precision','recall','f1-score']
classes = ['0','1','2']

df_metrics = pd.DataFrame({
    'type':classes * len(metrics),
    'name': [m for m in metrics for _ in classes],
    'Value':[report[c][m] for m in metrics for c in classes]
})

plt.figure(figsize=(10,8))
sns.barplot(x='name',y='Value',hue='type',data=df_metrics)
plt.title('Compare different type value')
plt.ylim(0,1)
plt.show()