#4大核心组件
核心目标:消除数据噪声、统一特征尺度、提升模型收敛、避免维度灾难,让数据满足模型输入需求。
分类(目标位离散值)
回归(目标位连续值)
聚类
异常检测:
关联规则apriori(关联规则挖掘,需结合mlxtend)
半监督分类
核心特征: 所有模型都遵循以下的规则:
核心指标:量化模型性能,判断模型泛化能力,避免过拟合/欠拟合
分类指标
回归指标
聚类指标:
交叉验证:
超参数调优:
学习曲线 learning_curve(可视化训练/测试得分随样本量变化)
验证曲线 validation_curve(可视化得分随超参数变化)
模型持久化
joblib/pickle(保存、加载训练好的模型)
joblib.dump(model,'model2.pkl')
客观衡量模型性能,指导模型调优,确保模型在新数据上的有效性
按照顺序执行多个步骤,前序输出作为后续输入。
针对不同特征应用不同预处理逻辑(如数值列标准化、类别列独热编码)
支持对管道内所有步骤的超参数调优
特征矩阵需要是二维数组或类数组。比如array或DataFrame
维度的定义: X.shape = (n_samples,n_fetures)
数据类型:
import numpy as np
import pandas as pd
X_np = np.array([[1.5,0.2,2.5],[3,5,6.5]])
X_df = pd.DataFrame({'age':[18,15,12],'hight':[160,155,150]})
X_np.shape #(2, 3)
X_df.shape #(3, 2)
使用X_np.shape查看维度,输出是(行,列)
这里是示例,X_np.shape有2行3列,即代表有2个样本,3个特征值。
X_df这里就很明显了,因为输入的时候有列名,所以很明显就知道是3行2列。3行代表3个样本(此处是不同的人)。
目标变量的特征
y_np=np.array([100,205])
y_df = pd.DataFrame({'weight':[120,105,90]})
y_np.shape #(2,)
y_df.shape #(3, 1)
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()