机器学习:监督学习:机器学习导论_第1页
机器学习:监督学习:机器学习导论_第2页
机器学习:监督学习:机器学习导论_第3页
机器学习:监督学习:机器学习导论_第4页
机器学习:监督学习:机器学习导论_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

机器学习:监督学习:机器学习导论1机器学习基础1.1什么是机器学习1.1.1机器学习的定义机器学习(MachineLearning)是人工智能(AI)的一个分支,它使计算机能够在没有明确编程的情况下从数据中学习并做出预测或决策。机器学习的核心在于构建算法,这些算法可以从数据中自动“学习”模式和特征,然后利用这些学习到的知识对新的数据进行分析和预测。1.1.2机器学习的应用领域图像识别:如人脸识别、车牌识别。自然语言处理:如语音识别、机器翻译。推荐系统:如电影推荐、商品推荐。医疗诊断:如疾病预测、病理分析。金融分析:如信用评分、市场预测。1.2监督学习概述1.2.1监督学习的定义监督学习是一种机器学习方法,其中算法通过学习带有标签的训练数据来预测新数据的标签。训练数据包括输入特征和对应的输出标签,算法的目标是找到输入特征与输出标签之间的关系,从而能够对未知数据进行准确预测。1.2.2监督学习与无监督学习的区别监督学习:需要有标签的训练数据,目标是预测新数据的标签。无监督学习:使用无标签数据,目标是发现数据中的结构或模式,如聚类。1.3示例:线性回归线性回归是一种基本的监督学习算法,用于预测连续值的输出。下面是一个使用Python和scikit-learn库实现线性回归的例子。#导入必要的库

importnumpyasnp

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.linear_modelimportLinearRegression

fromsklearn.metricsimportmean_squared_error

#创建数据集

#假设我们有房价预测的数据,其中特征是房屋的面积,标签是房屋的价格

np.random.seed(0)

X=np.random.rand(100,1)*1000#生成100个随机面积,范围在0到1000之间

y=2*X+1+np.random.randn(100,1)*10#生成价格,基于面积的线性关系,加上一些随机噪声

#划分数据集为训练集和测试集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#创建线性回归模型

model=LinearRegression()

#训练模型

model.fit(X_train,y_train)

#预测

y_pred=model.predict(X_test)

#计算预测误差

mse=mean_squared_error(y_test,y_pred)

print(f"MeanSquaredError:{mse}")

#解释模型

print(f"模型的斜率:{model.coef_}")

print(f"模型的截距:{ercept_}")在这个例子中,我们首先生成了一个简单的数据集,其中包含房屋面积和价格。然后,我们使用train_test_split函数将数据集划分为训练集和测试集。接下来,我们创建了一个LinearRegression模型,并使用训练集数据对其进行训练。最后,我们使用测试集数据评估模型的性能,并输出模型的斜率和截距,这些参数可以帮助我们理解模型是如何从数据中学习的。监督学习是机器学习中最常见的类型之一,它在许多实际应用中都发挥着重要作用,如预测分析、分类任务等。通过理解监督学习的基本概念和实现,我们可以更好地应用机器学习技术解决实际问题。2监督学习模型2.1线性回归2.1.1线性回归原理线性回归是一种用于预测连续值输出的监督学习算法。它假设输入特征与输出之间存在线性关系,通过拟合最佳线性方程来预测输出。线性回归模型可以表示为:y其中,y是预测的目标值,x1,x2.1.2最小二乘法与梯度下降最小二乘法是一种用于估计线性回归模型参数的方法,目标是最小化预测值与实际值之间的平方误差之和。梯度下降则是一种迭代优化算法,用于最小化损失函数,找到参数的最优值。示例:使用梯度下降法进行线性回归importnumpyasnp

importmatplotlib.pyplotasplt

#生成模拟数据

np.random.seed(0)

X=2*np.random.rand(100,1)

y=4+3*X+np.random.randn(100,1)

#梯度下降函数

defgradient_descent(X,y,theta,alpha,num_iters):

m=len(y)

J_history=np.zeros(num_iters)

foriinrange(num_iters):

predictions=X.dot(theta)

error=np.dot(X.transpose(),(predictions-y))

theta=theta-alpha*(1/m)*error

J_history[i]=compute_cost(X,y,theta)

returntheta,J_history

#计算损失函数

defcompute_cost(X,y,theta):

m=len(y)

predictions=X.dot(theta)

square_err=(predictions-y)**2

return1/(2*m)*np.sum(square_err)

#初始化参数

theta=np.random.randn(2,1)

alpha=0.01

num_iters=1000

#添加偏置项

X_b=np.c_[np.ones((100,1)),X]

#运行梯度下降

theta,J_history=gradient_descent(X_b,y,theta,alpha,num_iters)

#绘制结果

plt.scatter(X,y)

X_new=np.array([[0],[2]])

X_new_b=np.c_[np.ones((2,1)),X_new]

y_predict=X_new_b.dot(theta)

plt.plot(X_new,y_predict,"r-")

plt.show()2.2逻辑回归2.2.1逻辑回归原理逻辑回归用于分类问题,尤其是二分类问题。它使用Sigmoid函数将线性回归的输出转换为概率值,预测事件发生的可能性。h2.2.2最大似然估计与梯度下降最大似然估计用于估计逻辑回归模型的参数,通过最大化似然函数来找到参数的最优值。梯度下降同样可以用于优化逻辑回归的参数。示例:使用梯度下降法进行逻辑回归importnumpyasnp

fromsklearnimportdatasets

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.preprocessingimportStandardScaler

#加载数据集

iris=datasets.load_iris()

X=iris.data[:,[2,3]]

y=iris.target

#数据预处理

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1,stratify=y)

sc=StandardScaler()

sc.fit(X_train)

X_train_std=sc.transform(X_train)

X_test_std=sc.transform(X_test)

#梯度下降函数

defsigmoid(z):

return1.0/(1.0+np.exp(-z))

defcost_1(z):

return-np.log(sigmoid(z))

defcost_0(z):

return-np.log(1-sigmoid(z))

deflogistic_cost(y,y_pred):

returnnp.mean(cost_1(y_pred)*y+cost_0(y_pred)*(1-y))

deflogistic_regression(X,y,theta,alpha,num_iters):

m=len(y)

J_history=np.zeros(num_iters)

foriinrange(num_iters):

z=np.dot(X,theta)

h=sigmoid(z)

gradient=np.dot(X.T,(h-y))/m

theta=theta-alpha*gradient

J_history[i]=logistic_cost(y,h)

returntheta,J_history

#初始化参数

theta=np.zeros(X_train_std.shape[1])

alpha=0.001

num_iters=1000

#运行逻辑回归

theta,J_history=logistic_regression(X_train_std,y_train,theta,alpha,num_iters)

#绘制决策边界

defplot_decision_regions(X,y,classifier,resolution=0.02):

markers=('s','x','o','^','v')

colors=('red','blue','lightgreen','gray','cyan')

cmap=ListedColormap(colors[:len(np.unique(y))])

x1_min,x1_max=X[:,0].min()-1,X[:,0].max()+1

x2_min,x2_max=X[:,1].min()-1,X[:,1].max()+1

xx1,xx2=np.meshgrid(np.arange(x1_min,x1_max,resolution),

np.arange(x2_min,x2_max,resolution))

Z=classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)

Z=Z.reshape(xx1.shape)

plt.contourf(xx1,xx2,Z,alpha=0.4,cmap=cmap)

plt.xlim(xx1.min(),xx1.max())

plt.ylim(xx2.min(),xx2.max())

foridx,clinenumerate(np.unique(y)):

plt.scatter(x=X[y==cl,0],y=X[y==cl,1],alpha=0.8,c=cmap(idx),marker=markers[idx],label=cl)

plot_decision_regions(X_train_std,y_train,classifier=LogisticRegression(theta=theta))

plt.xlabel('petallength[standardized]')

plt.ylabel('petalwidth[standardized]')

plt.legend(loc='upperleft')

plt.show()2.3决策树2.3.1决策树原理决策树是一种树形结构的分类和回归算法,通过递归地选择最佳特征进行分割,构建一棵树模型。每个内部节点表示一个特征上的测试,每个分支表示一个测试结果,每个叶节点表示一个类别或输出值。2.3.2ID3算法与C4.5算法ID3算法使用信息增益作为特征选择的依据,而C4.5算法则使用信息增益比。C4.5算法还处理了连续特征和缺失值,是ID3算法的改进版本。2.4支持向量机2.4.1支持向量机原理支持向量机(SVM)是一种用于分类和回归的监督学习算法,通过寻找一个超平面来最大化不同类别之间的间隔。硬间隔SVM用于线性可分的数据,而软间隔SVM则允许一定程度的分类错误,适用于非线性可分的数据。2.4.2硬间隔与软间隔硬间隔SVM要求所有样本点都严格满足分类条件,即所有样本点都位于分类超平面的正确一侧。软间隔SVM通过引入松弛变量,允许一些样本点位于错误的一侧,从而处理非线性可分的数据。示例:使用软间隔SVM进行分类importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearnimportsvm

#生成模拟数据

np.random.seed(0)

X=np.r_[np.random.randn(20,2)-[2,2],np.random.randn(20,2)+[2,2]]

Y=[0]*20+[1]*20

#创建SVM分类器

clf=svm.SVC(kernel='linear',C=1.0)

#训练模型

clf.fit(X,Y)

#绘制决策边界

defmake_meshgrid(x,y,h=.02):

x_min,x_max=x.min()-1,x.max()+1

y_min,y_max=y.min()-1,y.max()+1

xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))

returnxx,yy

defplot_contours(ax,clf,xx,yy,**params):

Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])

Z=Z.reshape(xx.shape)

out=ax.contourf(xx,yy,Z,**params)

returnout

#绘制决策边界

X0,X1=X[:,0],X[:,1]

xx,yy=make_meshgrid(X0,X1)

plot_contours(plt,clf,xx,yy,cmap=plt.cm.coolwarm,alpha=0.8)

plt.scatter(X0,X1,c=Y,cmap=plt.cm.coolwarm,s=20,edgecolors='k')

plt.show()以上示例展示了如何使用Python的scikit-learn库中的SVM分类器进行分类,并绘制决策边界。通过调整C参数,可以控制模型的复杂度,C越小,模型越倾向于软间隔。3模型评估与选择3.1模型评估指标3.1.1准确率准确率(Accuracy)是分类模型中最直观的评估指标,它衡量的是模型正确分类的样本数占总样本数的比例。准确率高意味着模型在多数情况下能够做出正确的预测,但并不总是意味着模型性能好,特别是在类别不平衡的数据集上。示例代码假设我们有一个二分类问题,使用逻辑回归模型进行预测:fromsklearn.datasetsimportmake_classification

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.linear_modelimportLogisticRegression

fromsklearn.metricsimportaccuracy_score

#生成数据集

X,y=make_classification(n_samples=1000,n_features=20,n_informative=2,n_redundant=10,random_state=42)

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)

#训练模型

model=LogisticRegression()

model.fit(X_train,y_train)

#预测

y_pred=model.predict(X_test)

#计算准确率

accuracy=accuracy_score(y_test,y_pred)

print(f'准确率:{accuracy}')3.1.2精确率与召回率精确率(Precision)和召回率(Recall)是评估分类模型性能的两个重要指标,特别是在处理不平衡数据集时。精确率衡量的是预测为正类的样本中,实际为正类的比例。召回率衡量的是实际为正类的样本中,被模型正确预测为正类的比例。示例代码使用相同的逻辑回归模型,我们可以计算精确率和召回率:fromsklearn.metricsimportprecision_score,recall_score

#计算精确率和召回率

precision=precision_score(y_test,y_pred)

recall=recall_score(y_test,y_pred)

print(f'精确率:{precision}')

print(f'召回率:{recall}')3.1.3F1分数F1分数是精确率和召回率的调和平均数,它提供了一个单一的指标来评估模型的性能。F1分数高意味着模型在精确率和召回率上都有较好的表现。示例代码继续使用逻辑回归模型,我们可以计算F1分数:fromsklearn.metricsimportf1_score

#计算F1分数

f1=f1_score(y_test,y_pred)

print(f'F1分数:{f1}')3.2交叉验证3.2.1K折交叉验证K折交叉验证(K-FoldCrossValidation)是一种评估模型性能的方法,它将数据集分为K个子集,每次将其中一个子集作为测试集,其余子集作为训练集,进行K次训练和测试,最后将K次的评估结果平均,以减少评估的方差。示例代码使用sklearn的KFold进行K折交叉验证:fromsklearn.model_selectionimportKFold,cross_val_score

#定义K折交叉验证

kfold=KFold(n_splits=5,shuffle=True,random_state=42)

#使用cross_val_score计算交叉验证得分

scores=cross_val_score(model,X,y,cv=kfold)

print(f'交叉验证得分:{scores.mean()}')3.2.2留一交叉验证留一交叉验证(Leave-One-OutCrossValidation)是K折交叉验证的一个特例,其中K等于样本数。这意味着每次只有一个样本作为测试集,其余样本作为训练集,进行多次训练和测试,直到每个样本都被用作一次测试。示例代码使用sklearn的LeaveOneOut进行留一交叉验证:fromsklearn.model_selectionimportLeaveOneOut

#定义留一交叉验证

loo=LeaveOneOut()

#使用cross_val_score计算交叉验证得分

scores=cross_val_score(model,X,y,cv=loo)

print(f'留一交叉验证得分:{scores.mean()}')3.3模型选择3.3.1过拟合与欠拟合过拟合(Overfitting)和欠拟合(Underfitting)是模型选择时需要避免的两个极端。过拟合意味着模型在训练数据上表现很好,但在未见过的数据上表现较差。欠拟合则意味着模型在训练数据上表现就不好,可能是因为模型太简单,无法捕捉数据的复杂性。示例代码通过调整模型的复杂度,我们可以观察过拟合和欠拟合的现象:#创建不同复杂度的模型

models=[LogisticRegression(penalty='none'),LogisticRegression(penalty='l2',C=0.01)]

#计算训练集和测试集上的得分

formodelinmodels:

model.fit(X_train,y_train)

train_score=model.score(X_train,y_train)

test_score=model.score(X_test,y_test)

print(f'训练集得分:{train_score},测试集得分:{test_score}')3.3.2正则化技术正则化技术(Regularization)是一种防止过拟合的方法,它通过在损失函数中添加一个惩罚项,来限制模型的复杂度。常见的正则化技术有L1正则化和L2正则化。示例代码使用L2正则化技术调整模型复杂度:#使用L2正则化的逻辑回归模型

model=LogisticRegression(penalty='l2',C=0.1)

model.fit(X_train,y_train)

#计算训练集和测试集上的得分

train_score=model.score(X_train,y_train)

test_score=model.score(X_test,y_test)

print(f'训练集得分:{train_score},测试集得分:{test_score}')通过上述代码示例,我们可以看到如何在监督学习中使用不同的评估指标和交叉验证技术,以及如何通过正则化技术来调整模型的复杂度,避免过拟合和欠拟合的问题。4监督学习实战4.1数据预处理4.1.1数据清洗数据清洗是监督学习中至关重要的第一步,它涉及处理数据集中的缺失值、异常值和重复值。下面是一个使用Python和Pandas库进行数据清洗的例子。importpandasaspd

importnumpyasnp

#创建一个包含缺失值和异常值的示例数据集

data={'年龄':[25,30,np.nan,45,50,150],

'收入':[50000,60000,70000,80000,np.nan,90000],

'性别':['男','女','男','女','男','女']}

df=pd.DataFrame(data)

#处理缺失值

df['年龄'].fillna(df['年龄'].mean(),inplace=True)

df['收入'].fillna(df['收入'].median(),inplace=True)

#处理异常值

df=df[df['年龄']<100]

#输出清洗后的数据

print(df)4.1.2特征选择与工程特征选择帮助我们识别哪些特征对模型预测最有价值,而特征工程则涉及创建新的特征或转换现有特征以提高模型性能。以下是一个特征选择和工程的例子。fromsklearn.datasetsimportload_iris

fromsklearn.feature_selectionimportSelectKBest,f_classif

fromsklearn.preprocessingimportStandardScaler

#加载Iris数据集

iris=load_iris()

X,y=iris.data,iris.target

#特征选择

selector=SelectKBest(score_func=f_classif,k=2)

X_new=selector.fit_transform(X,y)

#特征工程:标准化

scaler=StandardScaler()

X_scaled=scaler.fit_transform(X_new)

#输出处理后的特征

print(X_scaled)4.2模型训练与调优4.2.1超参数调优超参数调优是通过调整模型的超参数来优化模型性能的过程。以下是一个使用随机森林分类器进行超参数调优的例子。fromsklearn.ensembleimportRandomForestClassifier

fromsklearn.model_selectionimportGridSearchCV

#创建随机森林分类器实例

clf=RandomForestClassifier()

#定义要调优的超参数

param_grid={

'n_estimators':[10,50,100],

'max_depth':[None,10,20],

'min_samples_split':[2,5,10]

}

#使用GridSearchCV进行超参数调优

grid_search=GridS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论