导语:更深入地探讨监督学习和非监督学习的知识,重点关注它们的理论基础、常用算法及实际应用场景。
上一节我们深入探索机器学习的根本原理,包括基本概念、分类及如何通过构建预测模型来应用这些理论,详情可见:
目录
监督学习
监督学习的核心在于从带有标签的数据中学习,在这种有标签的数据学习的过程中,算法的目标是找到输入特征和输出标签之间的映射关系。
理论基础
监督学习算法尝试建立一个模型,该模型可以对给定的输入数据做出准确的预测。这通常涉及到从数据中识别模式并建立预测函数。常见的监督学习任务包括分类和回归。分类任务预测离散的标签,而回归任务预测连续的输出。
常见算法
线性回归:在回归任务中,模型尝试找到特征和连续标签之间的线性关系。
决策树:这是一种可以用于分类和回归的算法,它通过一系列规则来进行预测。
支持向量机(SVM):SVM是一种强大的分类算法,特别适合处理高维空间中的数据。
应用场景
在医疗领域,监督学习可以用于疾病诊断,如基于患者数据预测糖尿病。此流程图是一个简化的糖尿病预测监督学习模型的创建和使用过程,在实际应用中可能需要更多的细节和额外的步骤,如特征选择、交叉验证、模型解释等。
在金融行业,监督学习被用于信用评分和欺诈检测。此流程图简要概述了监督学习在金融行业中的欺诈检测应用。实际应用中,可能还需要考虑数据隐私、合规性、模型解释性和实时性等因素。
非监督学习
非监督学习与监督学习不同,因为它处理的是没有标签的数据。这种类型的学习更多关注于发现数据内部的结构和模式。
理论基础
非监督学习的目标是探索数据的内在结构和模式,而不是预测标签。主要任务包括聚类、关联规则学习和降维。
常见算法
K-均值聚类:这是一种广泛使用的聚类算法,旨在将数据分成多个类别或群体。
主成分分析(PCA):PCA是一种降维技术,用于减少数据集的复杂性,同时保留最重要的信息。
应用场景
市场细分是非监督学习的一个经典应用,通过聚类相似的消费者来发现不同的市场细分。这个过程旨在将市场中的消费者或客户分成具有相似需求、行为或特征的不同组群,以便企业能够更好地理解和满足不同市场细分的需求。市场细分的一般流程如图:
在文本分析和自然语言处理中,非监督学习可用于主题建模和文档聚类等领域。主题建模用于发现文本数据中的主题或话题。这在新闻文章分类、社交媒体分析、文档摘要生成等领域非常有用;文档聚类则用于将文档根据其相似性分组,以便于文本检索、信息检索、情感分析等任务。
主题建模是一种非监督学习技术,用于从文本数据中自动识别和提取主题或话题。它在自然语言处理领域中有广泛的应用,可以帮助人们理解大规模文本语料库中的内容和趋势。主题是文本数据中一种抽象的概念,通常由一组相关的单词组成,描述了文档或文本片段的内容。主题建模旨在通过分析文本数据中的单词分布来自动发现这些主题。
主题建模的经典算法有:Latent Dirichlet Allocation (LDA): LDA是主题建模中最知名的算法之一。它假设文档是由一组主题混合而成的,每个主题都有一组相关的单词。LDA通过迭代过程来估计文档中的主题分布和主题中的单词分布;Non-Negative Matrix Factorization (NMF): NMF是另一种用于主题建模的算法。它通过将文本数据矩阵分解为两个非负矩阵来发现主题。一个矩阵代表主题-文档关系,另一个代表主题-单词关系。主题建模的流程如图:
实战案例:预测房价
我们将通过一个实战案例来具体展示如何使用监督学习构建一个预测模型。我们选择的案例是房价预测,这是一个经典的回归问题,目的是根据房屋的特征来预测其售价。
问题背景
在房地产市场,正确估计房屋价值对于买家、卖家、投资者乃至房地产经纪人都至关重要。房价受多种因素影响,包括房屋的大小、位置、年龄、近期装修情况等。
业务目标
开发一个模型,准确预测不同特征组合下房屋的市场售价。为房地产公司、投资者提供快速估价工具,帮助他们做出更明智的投资和购买决策。
数据集描述
每个样本包含如下特征:
-
基本属性:面积、房间数、楼层数、建造年份等。
-
地理位置:所在城市、街区、是否靠近市中心等。
-
附加属性:地下室面积、车库情况、花园大小等。
房价数据集的特征涵盖房屋的基本构造(如面积、房间数、楼层数、建造年份)、所处的地理位置(城市、街区、邻近市中心的情况)以及额外设施(地下室、车库、花园),为评估房产价值提供了全面信息。
数据清洗
数据清洗是机器学习项目中至关重要的一步,它直接影响模型的性能。对于房价预测案例,数据清洗的基本步骤包括:
处理缺失值
检查数据集中的缺失值。对于少量缺失的特征,可以使用均值、中位数或众数来填充。如果某个特征有大量缺失值,可以考虑删除该特征
import pandas as pd
# df包含了你的数据集
df = pd.read_csv('home_price.csv')
# 检查数据集中的缺失值
missing_values = df.isnull().sum()
# 显示每个特征的缺失值数量
print("缺失值统计:")
print(missing_values)
# 处理缺失值
for column, count in missing_values.items():
if count > 0:
if count < len(df) * 0.1: # 少量缺失的特征,使用均值填充
df[column].fillna(df[column].mean(), inplace=True)
else: # 大量缺失的特征,删除该特征
df.drop(column, axis=1, inplace=True)
# 显示处理后的数据集信息
print("\n处理后的数据集信息:")
print(df.info())
去除异常值
识别并去除异常值,这些可能是由于输入错误或其他非典型情况造成的。使用统计方法(如Z-score)或可视化方法(如箱线图)来检测异常值。
import pandas as pd
import numpy as np
from scipy import stats
# 创建一个包含异常值的DataFrame示例
data = {'Value': [10, 15, 20, 25, 100]}
df = pd.DataFrame(data)
# 计算Z-score
z_scores = np.abs(stats.zscore(df))
# 设置阈值,通常选择阈值为2或3
threshold = 2
# 找到Z-score超过阈值的行
outliers = np.where(z_scores > threshold)
# 去除异常值
df_cleaned = df[(z_scores < threshold).all(axis=1)]
# 显示去除异常值后的DataFrame
print("去除异常值后的DataFrame:")
print(df_cleaned)
转换非数值数据
很多机器学习算法要求输入是数值型的。因此,对于类别型数据(如街区名称),我们需要进行编码,如使用独热编码(One-Hot Encoding)
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
# 假设df是Pandas DataFrame,包含了房屋的特征和目标价格
# 分离特征和目标变量
X = df.drop('Price', axis=1)
y = df['Price']
# 数值型和类别型特征的列名
numeric_features = ['Area', 'Rooms', 'Age']
categorical_features = ['Location', 'Type']
# 创建预处理步骤
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))])
# 使用ColumnTransformer来应用这些转换
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features), ('cat', categorical_transformer, categorical_features)])
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
特征选择
特征选择涉及决定使用哪些特征来训练模型。这一步骤可以减少模型的复杂性和过拟合的风险。
相关性分析
使用相关系数矩阵来检查各个特征与目标变量(房价)之间的相关性,高度相关的特征可能对预测房价有更大的影响。例如,房屋面积对于房价的影响大于楼层对于房价的影响,即房屋面积比楼层更适合作为训练房价预测模型的特征。
特征重要性评估
使用某些算法(如随机森林)可以评估不同特征的重要性。
根据特征重要性来选择最有影响的特征。
模型构建与训练
选择算法
在这个案例中,由于其基于回归的性质以及线性回归模型的简单易学特点,开发者可以优先选择线性回归模型作为起点学习算法。线性回归是一个简单而直观的模型,适合初学者理解和实现,因此可作为探索机器学习领域的起点。随着对线性回归的熟悉和理解,开发者可以进一步探索和优化模型,拓展到更复杂的算法和技术领域。
模型训练
一旦选择了合适的算法,接下来的关键步骤是使用训练数据来训练模型。这个过程涉及到调整模型的各种参数,例如学习率、正则化项等,以不断改善模型的性能和准确度。通过对训练数据的反复迭代学习,模型将逐渐优化,更好地拟合数据,从而使其能够对新数据做出更准确的预测。使用选定的特征来构建和训练模型。
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.pipeline import Pipeline
# 创建一个管道,结合预处理步骤和线性回归模型model =
Pipeline(steps=[('preprocessor', preprocessor),
('regressor', LinearRegression())])
# 训练模型
model.fit(X_train, y_train)
# 进行预测
y_pred = model.predict(X_test)
# 评估模型
print("模型的均方误差: ", mean_squared_error(y_test, y_pred))
这段代码使用Scikit-learn库构建了一个处理房价预测问题的线性回归模型。它首先通过预处理管道处理数值型和类别型特征,然后将处理后的数据用于训练线性回归模型,并对测试集进行预测,最后计算模型的均方误差以评估其性能。
下一节我们将进行监督学习的进阶探索
以上,欢迎点赞收藏、评论区交流