机器模式识别 2_第1页
机器模式识别 2_第2页
机器模式识别 2_第3页
机器模式识别 2_第4页
机器模式识别 2_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

机器学习与模式识别第六章数据预处理与特征工程第六章

数据预处理与特征工程

6.1数据清洗

6.2特征处理

6.3特征选择6.4数据变换与降维26.1数据清洗-处理缺失值

3处理缺失值的策略主要有三种:删除缺失值、插补缺失值和标记缺失值。注意数据的分布是否发生变化,重新评估模型性能,确保数据完整性,审查处理方法的合理性,并保持数据的可解释性。importpandasaspdimportnumpyasnpimportseabornassnsimportmatplotlib.pyplotaspltfromsklearn.imputeimportKNNImputerdata={'A':[1,2,np.nan,4,5],'B':[np.nan,2,3,np.nan,5],'C':[1,np.nan,np.nan,4,5]}df=pd.DataFrame(data)print(df.isnull().sum())df_dropped=df.dropna()print(df_dropped)df_filled_mean=df.fillna(df.mean())print(df_filled_mean)imputer=KNNImputer(n_neighbors=2)df_filled_knn=pd.DataFrame(imputer.fit_transform(df),columns=df.columns)print(df_filled_knn)6.1数据清洗-异常值识别异常值是指在数据集中显得异常高或异常低的值,这些值可能是由于数据录入错误、测量误差或实际存在的异常情况引起的。4#示例数据data={'A':[1,2,3,4,100,6,7,8,9,10]}df=pd.DataFrame(data)#使用箱线图检测异常值sns.boxplot(x=df['A'])plt.title('BoxplotofFeatureA')plt.show()首先,通过可视化手段和统计方法来识别异常值。6.1数据清洗-处理异常值5分析:根据需求可以选择不同的处理策略。处理:删除异常值、替换异常值、基于模型的方法处理异常值。importpandasaspdfromsklearn.ensembleimportIsolationForestdata={'A':[1,2,3,4,100,6,7,8,9,10]}df=pd.DataFrame(data)#使用孤立森林检测和处理异常值defisolation_forest_outliers(df):iso_forest=IsolationForest(contamination=0.1,random_state=42)df['outlier']=iso_forest.fit_predict(df[['A']])df_no_outliers=df[df['outlier']!=1].drop(columns='outlier')returndf_no_outliersdf_iso_forest=isolation_forest_outliers(df.copy())df_lof=local_outlier_factor(df.copy())6.1数据清洗-数据一致性检查

6数据类型转换,指将数据从一种类型转换为另一种类型。对于确保数据在后续分析中的可操作性和正确性非常重要。重复数据,指数据集中存在的完全相同的记录或特征。他们会导致统计分析和模型训练中的偏差,因此需要识别并删除重复数据。数据格式标准化,确保数据在存储和处理时具有一致的格式。data={'ID':['001','002','002','004','005'],'SaleDate':['01-01-2024','02-02-2024','03-03-2024','04-04-2024','05-05-2024'],'Amount':['$1,000','2000.50','2000.50','3000','4000']}df=pd.DataFrame(data)df['ID']=pd.to_numeric(df['ID'])df['SaleDate']=pd.to_datetime(df['SaleDate'])print(df.dtypes);print(df)duplicates=df.duplicated()print(df[duplicates])df_no_duplicates=df.drop_duplicates()print(df_no_duplicates)df_no_duplicates['Amount']=df_no_duplicates['Amount'].str.replace('$',″).str.replace(',',″).str.replace('',″).astype(float)print(df_no_duplicates)6.2特征处理-标称特征处理7标称特征处理是针对那些不具有数值意义的特征,如颜色、城市名称等。这类特征无法直接用于模型训练,需要转换为数值形式。哑变量与独热编码是最常见的转换方法。频

码和

码也是处理标称特征的有效方法。importpandasaspddata={'Fruit':['Apple','Banana','Cherry','Apple']}df=pd.DataFrame(data)#哑变量df_dummy=pd.get_dummies(df,columns=['Fruit'],prefix='Fruit',drop_first=True)print(df_dummy.map(int))#独热编码df_one_hot=pd.get_dummies(df,columns=['Fruit'],prefix='Fruit')print(df_one_hot.map(int))6.2特征处理-数值特征处理8数值特征处理主要包括标准化与归一化、分箱、多项式特征与交互特征等。处理数值特征可以帮助模型更好地理解数据的分布和特性。标准化将数据调整为均值为0、标准差为1的标准正态分布。归一化是一种将数据特征调整到特定范围(通常是0到1)的方法。分箱是将连续变量离散化,通过将数值特征分割成多个区间来处理。多项式特征和交互特征通过组合现有特征来创建新的特征,增强模型的表现力。fromsklearn.preprocessingimportStandardScalerMinMaxScalerdata={'Feature1':[10,20,30,40,50],'Feature2':[100,200,300,400,500]}df=pd.DataFrame(data)scaler=StandardScaler()df_standardized=pd.DataFrame(scaler.fit_transform(df),columns=df.columns)scaler=MinMaxScaler()df_normalized=pd.DataFrame(scaler.fit_transform(df),columns=df.columns)fig,ax=plt.subplots(1,2,figsize=(12,6))ax[0].set_title('OriginalData')ax[0].boxplot([df['Feature1'],df['Feature2']],labels=['Feature1','Feature2'])ax[1].set_title('NormalizedData')ax[1].boxplot([df_normalized['Feature1'],df_normalized['Feature2']],labels=['Feature1','Feature2'])plt.show()6.2特征处理-数值特征处理9fromsklearn.preprocessingimportPolynomialFeaturesdata={'Age':[25,35,45,55]}df=pd.DataFrame(data)df['Age_binned']=pd.cut(df['Age'],bins=[20,30,40,50,60],labels=['20-30','30-40','40-50','50-60'])print(df)data={'Feature1':[1,2,3],'Feature2':[4,5,6]}df=pd.DataFrame(data)poly=PolynomialFeatures(degree=2,include_bias=False)poly_features=poly.fit_transform(df)df_poly=pd.DataFrame(poly_features,columns=poly.get_feature_names_out(df.columns))print(df_poly)6.2特征处理-时间与日期特征处理10时间与日期特征处理涉及从时间戳中提取有用的信息,如年、月、日、星期、小时等。这些特征有助于捕捉时间相关的模式,提升模型对时间序列数据的理解。可以从时间戳中提取各种时间特征,以更好地分析时间趋势。周期性特征处理如月份或星期,通常需要通过正弦和余弦变换来捕捉其周期性,确保模型能识别出周期性的变化规律。importnumpyasnpdata={'Timestamp':['2023-05-0108:30:00','2023-06-1514:45:00']}df=pd.DataFrame(data)df['Timestamp']=pd.to_datetime(df['Timestamp'])#提取时间特征df['Year']=df['Timestamp'].dt.yeardf['Month']=df['Timestamp'].dt.monthdf['Day']=df['Timestamp'].dt.daydf['Hour']=df['Timestamp'].dt.hourdf['DayOfWeek']=df['Timestamp'].dt.dayofweekprint(df)#提取周期性特征df['Month_sin']=np.sin(2*np.pi*df['Month']/12)df['Month_cos']=np.cos(2*np.pi*df['Month']/12)print(df)6.2特征处理-文本与图像特征处理11文本与图像特征处理涉及从文本数据中提取有意义的特征,

以及从图像数据中提取特征。常用的方法有词袋模型(BagofWords)、TF-IDF(词频-逆文档频率)、词向量(WordEmbeddings)等。词袋模型可以将文本转换为向量形式,

以便进行后续分析。图像特征提取的方法有很多,包括传统的图像处理技术和基于深度学习的方法。对于灰度图像,

每个像素值表示图像中该点的亮度;对于彩色图像,

每个像素值由三个通道(通常是RGB)表示。fromsklearn.feature_extraction.textimportCountVectorizertext_data=['Machinelearningisfascinating','Deeplearningmodelsarepowerful']#词袋模型vectorizer=CountVectorizer()X=vectorizer.fit_transform(text_data)print(pd.DataFrame(X.toarray(),columns=vectorizer.get_feature_names_out()))df['Month_cos']=np.cos(2*np.pi*df['Month']/12)print(df)#图像展平fromskimageimportioimage=io.imread('/150')image_features=image.flatten()print(″Featurevectorshape:″,image_features.shape)Featurevectorshape:(67500,)6.2特征处理-文本与图像特征处理12提取图像的边缘信息在图像分割、目标检测和追踪、图像增强和去噪等领域具有重要作用。常见的边缘检测算子包括Canny算子、Sobel算子、Prewitt算子等。fromskimageimportiofromskimage.featureimportcannyfromskimage.colorimportrgb2grayimportmatplotlib.pyplotaspltimage=io.imread('/150')#将彩色图像转换为灰度图像gray_image=rgb2gray(image)#使用Canny算法提取边缘信息edges=canny(gray_image)fig,ax=plt.subplots(nrows=1,ncols=2,figsize=(10,5))ax[0].imshow(image,cmap='gray')ax[0].set_title('OriginalImage')ax[0].axis('off')ax[1].imshow(edges,cmap='binary')ax[1].set_title('EdgesDetected')ax[1].axis('off')plt.show()6.3特征选择-过滤法13过滤法是最简单直接的特征选择方法,依赖特征本身的统计性质来进行选择。常见的方法包括方差选择法、卡方检验和相关系数法。方差选择法通过计算每个特征的方差,剔除那些方差较小、变化不大的特征,因为这些特征对模型贡献较小。卡方检验通常用于离散型特征,通过计算特征与目标变量之间的独立性来选择特征。相关系数法通过计算每个特征与目标变量之间的相关系数来选择特征。from

sklearn.feature_selectionimportVarianceThreshold,SelectKBest,chi2data={'feature1':[1,2,3,4,5],'feature2':[2,2,2,2,2],'feature3':[1,3,5,7,9]}df=pd.DataFrame(data)selector=

VarianceThreshold(threshold=1)#

方差选择法selected_features=selector.fit_transform(df)data={'feature1':[1,2,3,4,5],'feature2':[0,1,0,1,0],'feature3':[10,11,12,13,14]}target=[0,1,0,1,0]df=pd.DataFrame(data)selector=SelectKBest(chi2,k=2)#卡方检验selected_features=selector.fit_transform(df,target)data={'feature1':[1,2,3,4,5],'feature2':[2,2,2,2,2],'feature3':[1,3,5,7,9]}target=[1,2,3,4,5]df=pd.DataFrame(data)df['target']=targetcorrelations=df.corr()['target'].drop('target')#计算相关系数print(″Featurecorrelations:\n″,correlations)threshold=0.8#选择相关系数高于阈值的特征selected_features=correlations[abs(correlations)>threshold].index6.3特征选择-包裹法14包裹法是一种通过训练模型来进行特征选择的方法,它将特征选择过程嵌入模型训练中,评估不同特征组合对模型性能的影响。常见的方法包括递归特征消除

、前向选择和

后向消除。递归特征消除是一种通过递归的训练模型,评估特征的重要性并剔除最不重要的特征,直到选出指定数量的特征的方法。fromsklearn.feature_selectionimportRFEfromsklearn.linear_modelimportLogisticRegressiondata={'feature1':[1,2,3,4,5],'feature2':[0,1,0,1,0],'feature3':[10,11,12,13,14]}target=[0,1,0,1,0]zdf=pd.DataFrame(data)#递归特征消除model=LogisticRegression()rfe=RFE(model,n_features_to_select=2)fit=rfe.fit(df,target)selected_features=fit.transform(df)6.3特征选择-包裹法15前向选择是一种从空特征集合开始,每次迭代中逐步加入最能提高模型性能的特征的方法。(1)从空特征集合开始。(2)逐个评估每个特征的加入对模型性能的影响,选择能显著提高模型性能的特征加入集合。(3)重复上述步骤,直到加入新特征不再显著提升模型性能为止。from

sklearn.linear_modelimportLinearRegressionfrommlxtend.feature_selectionimportSequentialFeatureSelectorasSFSdata={'feature1':[1,2,3,4,5],'feature2':[2,4,1,3,5],'feature3':[5,3,4,2,1]}target=[1,2,3,4,5]df=pd.DataFrame(data)#前向特征选择sfs=SFS(LinearRegression(),k_features=2,forward=True,floating=False,scoring='r2',cv=0)sfs=sfs.fit(df,target)selected_features=list(sfs.k_feature_names_)6.3特征选择-包裹法16后向消除与前向选择相反,它从包含所有特征的集合开始,每次迭代中移除对模型性能影响最小的特征。(1)从包含所有特征的集合开始。(2)逐个评估每个特征的移除对模型性能的影响,选择对模型性能影响最小的特征移除。(3)重复上述步骤,直到移除特征不再显著提高模型性能为止。fromsklearn.linear_modelimportLinearRegressionfrommlxtend.feature_selectionimportSequentialFeatureSelectorasSFSdata={'feature1':[1,2,3,4,5],'feature2':[2,4,1,3,5],'feature3':[5,3,4,2,1]}target=[1,2,3,4,5]df=pd.DataFrame(data)#后向特征消除sfs=SFS(LinearRegression(),k_features=2,forward=False,floating=False,scoring='r2',cv=0)sfs=sfs.fit(df,target)selected_features=list(sfs.k_feature_names_)6.3特征选择-嵌入法17嵌入法是特征选择的一种方法,它在模型训练过程中直接选择特征。利用模型自身的特性在训练过程中自动进行特征选择。常见的方法包括基于正则化的特征选择和基于树模型的特征选择。正则化技术通过在模型的损失函数中添加惩罚项来约束模型的复杂度。最常用的方法是L1正则化(Lasso回归)和L2正则化(Ridge回归)Lasso回归是一种带有L1正则化的线性回归方法,它通过引入L1惩罚项使某些特征的系数缩减为零,从而实现特征选择。fromsklearn.linear_modelimportLassofromsklearn.datasetsimportfetch_california_housing#加载加利福尼亚房价数据集housing=fetch_california_housing()df=pd.DataFrame(housing.data,columns=housing.feature_names)target=housing.target#Lasso回归lasso=Lasso(alpha=0.1)lasso.fit(df,target)coefficients=pd.Series(lasso.coef_,index=df.columns)print(″Featurecoefficients:\n″,coefficients)selected_features=df.columns[lasso.coef_!=0]print(″SelectedfeaturesusingLasso:\n″,selected_features)6.3特征选择-嵌入法18Ridge回归是一种带有L2正则化的线性回归方法,它通过引入L2惩罚项来约束所有特征的系数,虽然不会将系数缩减为零,但可以减少不重要特征的影响。fromsklearn.linear_modelimportRidge#Ridge回归ridge=Ridge(alpha=0.1)ridge.fit(df,target)coefficients=pd.Series(ridge.coef_,index=df.columns)coefficients.plot(kind='barh')plt.title(″FeaturecoefficientsfromRidgeRegression″)plt.show()6.3特征选择-嵌入法19基于树模型的特征选择方法通过计算特征在树结构中的重要性来进行选择。常用的包括决策树、随机森林和梯度提升树(GradientBoostingDecisionTree,GBDT)随机森林是一种集成学习方法,通过训练多棵决策树并将它们的预测结果进行平均来提高模型的准确性和稳定性。fromsklearn.ensembleimportRandomForestRegressor#随机森林forest=RandomForestRegressor(n_estimators=100,random_state=42)forest.fit(df,target)#输出特征重要性importances=pd.Series(forest.feature_importances_,index=df.columns)print(″Featureimportances:\n″,importances)#选择重要性高于阈值的特征threshold=0.05selected_features=df.columns[importances>threshold]print(″SelectedfeaturesusingRandomForest:\n″,selected_features)6.3特征选择-嵌入法20梯度提升树(GBDT)是一种通过逐步添加决策树来优化损失函数的集成学习方法。总之,嵌入法是特征选择中的一种重要技术,通过利用模型的特性自动选择特征,可以显著提高模型的性能和稳定性。fromsklearn.ensembleimportGradientBoostingRegressor#梯度提升树gbdt=GradientBoostingRegressor(n_estimators=100,random_state=42)gbdt.fit(df,target)#输出特征重要性importances=pd.Series(gbdt.feature_importances_,index=df.columns)print(″Featureimportances:\n″,importances)#选择重要性高于阈值的特征selected_features=df.columns[importances>threshold]print(″SelectedfeaturesusingGBDT:\n″,selected_features)6.4.1数据变换与降维-数据变换对数变换通过对数据取对数来减小数据的偏态和方差平方根变换通过对数据取平方根来减小数据的偏态和方差Box-Cox变换是一种通过寻找最佳参数来稳定方差和减少偏态的技术21#生成示例数据data=np.random.exponential(scale=2,size=1000)df=pd.DataFrame(data,columns=['Original']df['Log']=np.log(df['Original'])#平方根变换df['Sqrt']=np.sqrt(df['Original'])#Box-Cox变换df['BoxCox'],lambda_optimal=boxcox(df['Original'])6.4.2数据降维-主成分分析数据降维是将高维数据映射到低维空间的过程,以减少数据的维度。这可以帮助处理高维数据、减少噪声、提高计算效率,并增强数据的可解释性主成分分析(PrincipalComponentAnalysis,PCA)是一种线性降维方法,通过将数据投影到方差最大的方向上,找到数据的主成分,从而减少数据的维度。22基本流程1.标准化数据:首先将数据标准化,使其均值为0,方差为1。假设数据矩阵为X,其每一行代表一个样本,每一列代表一个特征。2.

计算协方差矩阵。3.

特征值分解:对协方差矩阵进行特征值分解,得到特征值和特征向量4.选择主成分:选择前k个最大的特征值对应的特征向量,构成变换矩阵。5.变换数据:将原始数据投影到新的特征空间。其中,Λ是特征值对角矩阵,V是特征向量矩阵。6.4.2可视化展示Iris数据集包含150个样本,分为三个不同种类的鸢尾花23花萼长度

花萼宽度

花瓣长度

花瓣宽度

类别5.1 3.51.40.2Setosa7.0 3.24.71.4Versicolor6.33.36.02.5Virginica#加载示例数据iris=load_iris()X=iris.datay=iris.target#PCA降维pca=PCA(n_components=2)X_pca=pca.fit_transform(X)#可视化PCA降维后的数据foriinrange(len(set(y))):plt.scatter(X_pca[y==i,0],X_pca[y==i,1],label=iris.target_names[i])plt.xlabel('主成分1')plt.ylabel('主成分2')plt.title('鸢尾花数据集的主成分分析')通过观察不同类别的点的分布,判断PCA是否有效地将不同类别的数据分开,从而为后续的分类和分析提供帮助6.4.2线性判别分析线性判别分析(LinearDiscriminantAnalysis,LDA)是一种监督学习的降维方法,通过最大化类间方差与类内方差的比值,找到最能区分不同类别的投影方向。LDA的目标是找到一个投影方向,使得不同类别的数据在该方向上的投影尽可能分开。24基本流程1.计算类内散布矩阵

其中,C是类别数,μi是第i类的均值向量2.计算类间散布矩阵

其中,Ni

是第i类的样本数,μ是总体均值向量3.求解广义特征值问题

,找到投影矩阵W4.变换数据:将原始数据投影到新的特征空间6.4.2可视化展示25fromsklearn.discriminant_analysisimportLinearDiscriminantAnalysis#LDA降维lda=LinearDiscriminantAnalysis(n_components=2)X_lda=lda.fit_transform(X,y)#可视化LDA降维后的数据foriinrange(len(set(y))):plt.scatter(X_lda[y==i,0],X_lda[y==i,1],label=iris.target_names[i])plt.xlabel('线性判别1')plt.ylabel('线性判别2')plt.title('鸢尾花数据集的线性判别分析')plt.legend(loc='uppercenter')plt.show()6.4.2奇异值分解奇异值分解(SingularValueDecomposition,SVD)是一种矩阵分解方法,通过分解数据矩阵,找到其奇异值和奇异向量,从而实现降维。SVD的目标是将数据矩阵分解为三个矩阵的乘积,使得数据在低维空间中得以表示。26基本流程1.分解数据矩阵X为三个矩阵的乘积其中,U是左奇异向量矩阵,Σ是奇异值对角矩阵,V是右奇异向量矩阵2.选择前k个最大的奇异值对应的奇异向量,构成新的特征空间6.4.2可视化展示27fromsklearn.decompositionimportTruncatedSVD#SVD降维svd=TruncatedSVD(n_components=2)X_svd=svd.fit_transform(X)#可视化SVD降维后的数据foriinrange(len(set(y))):plt.scatter(X_svd[y==i,0],X_svd[y==i,1],label=iris.target_names[i])plt.xlabel('奇异值分解1')plt.ylabel('奇异值分解2')plt.title('鸢尾花数据集的奇异值分解')plt.legend(loc='uppercenter')plt.savefig('svd.png')plt.show()通过观察散点图,可以评估SVD降维效果,判断是否有效地将不同类别的数据分开,这有助于后续的分类和分析6.4.2

温馨提示

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

最新文档

评论

0/150

提交评论