机器学习在我们现代生活中运用于方方面面,比如医疗检测,人员分类,图像识别,股票预测等等。所谓机器学习,就是将数据载入计算机中,通过一系列操作让计算机对数据进行学习,积累经验,从而能够独立完成目标预测的过程。
在独立完成项目的时候,我们要注意该项目的各项需求,在这里把它分成两种:功能性需求,非功能性需求。对于功能性需求就需要我们逐个去想办法实现,对于非功能性需求我们可以把他放在项目完成的最后,进行美化。
那么项目开始第一步:数据采集
你可以是已有数据导入,也可以通过网络获取,我在这里导入的是自己编辑的一个鸢尾花数据。
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as p
data = pd.read_csv('iris.data',header=None)
拿到数据后,因为其中肯能会有缺失值、空值、异常值,这里称为‘脏数据’,所以我们要对其进行处理,这一步就叫数据清洗。
***注意在处理数据时一定要保证数据是整数或者浮点型 我就不作演示了***
data.drop_duplicates()
#删除重复值
print(data.isnull().sum())
#看有多少缺失值
for i in data.columns():
data.fillna(data.median,inplace=True)
#循环填充缺失值
def error(column):
q1 = column.quantile(0.25)
q3 = column.quantile(0.75)
#得到上下四分位数
iqr = q3-q1
low_border = q1-iqr*1.5
high_border = q3+iqr*1.5
#得到异常范围
err = (column<low_border)|(column>high_border)
#筛选异常
column[err] = column.mean()
#均值填充 可以根据数据情况选择最佳的填充类型
#填充异常函数
for i in data.columns():
error(data[i])
#循环使用填充异常函数
项目第二部:选择重要特征(进行特征处理)
#特征选择及处理:对特征进⾏归⼀化、标准化处理、特征降维等;
x = data.iloc[:,:-1]
y = data.iloc[:,-1]
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
x = StandardScaler().fit_transform(x)
x = PCA(2).fit_transform(x)
from sklearn.model_selection import train_test_split
trax,tesx,tray,tesy = train_test_split(x,y,train_size=0.7,random_state=1)
项目第三部:基于机器学习分类模型进行训练
模型介绍附上
# 逻辑回归模型:
# 选择原因:逻辑回归模型简单易懂,计算效率高,适用于二分类问题。
# 适用场景:当数据特征与目标变量之间存在线性关系时,逻辑回归表现良好。
# 逻辑模型训练和测试的底层 更多底层可以自行查阅
class Logistic:
def __init__(self,lr=0.1,iter=1000):
self.theta = None
self.lr = lr
self.iter = iter
def fit(self,x,y):
m,n = x.shape
self.theta = p.zeros((n,1))
for i in range(self.iter):
h = p.dot(x,self.theta)
s = 1/(1+p.exp(-h))
cost = y-s
dele = 1/m*p.dot(x.T,cost)
self.theta = self.theta-self.lr*dele
def predict(self,x):
h = p.dot(x,self.theta)
s = 1/(1+p.exp(-h))
return p.where(s<0.5,0,1)
lo = Logistic()
# (2)AdaBoost算法模型:
# 选择原因:利用弱分类器构建强分类器:AdaBoost算法通过迭代的方式,结合多个弱分类器(性能略优于随机猜测的分类器)来构建一个强大的最终分类器(强分类器)。这种策略使得即使弱分类器的性能有限,也能通过组合达到较高的分类精度。适用场景:当数据特征维度较高或存在非线性关系时,SVM可能表现更好。
# 使用场景:
# 分类问题:AdaBoost算法主要适用于二分类和多分类问题,通过改变样本权重和结合多个弱分类器,AdaBoost可以有效地提高分类性能。
# 图像分类:AdaBoost可以用于图像分类任务,如识别不同的物体或场景。
# 文本分类:AdaBoost也可以用于文本分类任务,如情感分析、主题分类等。
# 会员营销预测:在会员营销中,AdaBoost可以帮助企业预测哪些会员会对下一次营销活动做出响应,从而制定更有效的营销策略。
# 回归问题:虽然AdaBoost最初是为分类问题设计的,但它也可以用于回归问题,如房价预测、股票价格预测等。
# 特征选择:AdaBoost可以用于特征选择,通过评估弱分类器在不同特征上的表现来选择最重要的特征。
# 异常检测:AdaBoost可以用于异常检测任务,如网络入侵检测、信用卡欺诈检测等。通过关注那些难以分类的样本,AdaBoost可以检测出异常或欺诈行为。
# 人脸识别:在安全和访问控制系统中,AdaBoost可以用于面部识别任务,如人脸检测、人脸识别等。通过逐步关注难以区分的人 脸特征,AdaBoost可以提高识别系统的准确性
from sklearn.ensemble import AdaBoostClassifier
ad = AdaBoostClassifier()
# (3)集成学习模型:
from sklearn.ensemble import RandomForestClassifier,GradientBoostingClassifier
# 随机森林:基于决策树的集成方法,通过构建多个决策树并取平均值或众数来减少过拟合。
rf = RandomForestClassifier()
# 梯度提升决策树:通过迭代地拟合残差来构建强学习器,对噪 声和异常值较不敏感。
gb = GradientBoostingClassifier()
# 选择原因:集成学习模型能够结合多个弱学习器的优点,提高整体性能。
# 适用场景:当数据特征复杂、非线性关系强或需要提高模型稳定性时,集成学习模型通常表现较好
项目第四步:模型训练和优化
#模型训练
lo.fit(trax,tray)
ad.fit(trax,tray)
rf.fit(trax,tray)
gb.fit(trax,tray)
# 使用网格搜索交叉验证设置合适的超参数,如树的数量等。
gs = GridSearchCV(ad,param_grid={'n_estimators':p.linspace(10,300,30,dtype=int)})
gs.fit(trax,tray)
ad_best = gs.best_params_['n_estimators']
gs = GridSearchCV(rf,param_grid={'n_estimators':p.linspace(10,300,30,dtype=int)})
gs.fit(trax,tray)
rf_best = gs.best_params_['n_estimators']
gs = GridSearchCV(gb,param_grid={'n_estimators':p.linspace(10,300,30,dtype=int)})
gs.fit(trax,tray)
gb_best = gs.best_params_['n_estimators']
项目最后一步:验证得分 模型打包 连接服务器 项目结束。
import time
from sklearn.metrics import accuracy_score,recall_score,confusion_matrix,classification_report,roc_auc_score,roc_curve
def train1(model_name,model_api):
model = model_api
train_start =time.time()
model.fit(trax,tray)
train_time = time.time()-train_start
print(f'{model_name}的训练时间:',train_time)
pre_start = time.time()
model.predict(tesx)
pre_time = time.time() - pre_start
print(f'{model_name}的预测时间:', pre_time)
acc = accuracy_score(tesy,model.predict(tesx))
rec = recall_score(tesy,model.predict(tesx))
con = confusion_matrix(tesy,model.predict(tesx))
clas = classification_report(tesy,model.predict(tesx))
fp,tp,th = roc_curve(tesy,model.predict_proba(tesx)[:,1])
auc = roc_auc_score(tesy,model.predict_proba(tesx)[:,1])
plt.plot(fp,tp,label=auc)
plt.legend()
print(f'{model_name}的准确率、召回率、混淆矩阵、分类报告分别是:',acc,rec,con,clas)
plt.show()
train1('ad',ad)
train1('rf',rf)
train1('gb',gb)