别再死磕理论!用这几个案例轻松入门机器学习
在人工智能飞速发展的时代,机器学习作为其核心领域,吸引着无数人的目光。但对于初学者来说,那些复杂的公式和抽象的概念常常让人望而却步。其实,通过实际案例来学习机器学习,就像找到了一把开启宝藏大门的钥匙,能让我们更直观、更轻松地掌握这门技术。今天,就让我们一起走进几个有趣又实用的机器学习案例,揭开机器学习的神秘面纱。
别再死磕理论!用这几个案例轻松入门机器学习
在人工智能飞速发展的时代,机器学习作为其核心领域,吸引着无数人的目光。但对于初学者来说,那些复杂的公式和抽象的概念常常让人望而却步。其实,通过实际案例来学习机器学习,就像找到了一把开启宝藏大门的钥匙,能让我们更直观、更轻松地掌握这门技术。今天,就让我们一起走进几个有趣又实用的机器学习案例,揭开机器学习的神秘面纱。
一、趣味案例带你走进机器学习世界
(一)鸢尾花的 “聚类游戏”:K-Means 算法实战
鸢尾花数据集是机器学习领域的经典数据集,它包含 150 个样本,每个样本有 4 个特征,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度,这些样本分属于 3 种不同的鸢尾花品种。
数据准备阶段:我们借助sklearn
库强大的load_iris
函数,轻松获取鸢尾花数据集,再用pandas
库把它变成规整的DataFrame
格式,方便后续处理。
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
data = pd.DataFrame(iris.data, columns=iris.feature_names)
- 模型搭建与训练:这里我们选用
K-Means
聚类算法,它能把相似的数据点聚集到一起。我们设定聚类数为 3,对应鸢尾花的 3 个品种。然后让模型在数据中 “摸索”,找到最佳的聚类方式。
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
model.fit(data)
label_pred = model.labels_
结果评估与可视化呈现:聚类效果好不好呢?我们用聚类平方误差总和(inertia
)来衡量,这个值越小,说明聚类效果越理想。为了更直观地看到聚类结果,我们用matplotlib
库绘制散点图,不同颜色和形状的点代表不同的聚类,黑色方块表示聚类中心,一目了然。
inertia = model.inertia_
print("聚类平方误差总和为: ", inertia)
import matplotlib.pyplot as plt
x0 = data[label_pred == 0]
x1 = data[label_pred == 1]
x2 = data[label_pred == 2]
plt.scatter(x0["sepal length (cm)"], x0["sepal width (cm)"], c = "red", marker='o', label='label0')
plt.scatter(x1["sepal length (cm)"], x1["sepal width (cm)"], c = "green", marker='*', label='label1')
plt.scatter(x2["sepal length (cm)"], x2["sepal width (cm)"], c = "blue", marker='+', label='label2')
plt.scatter(model.cluster_centers_[:,0],model.cluster_centers_[:,1], c = "black", marker='s',label='centroids')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend(loc=2)
plt.show()
(二)给鸢尾花 “贴标签”:KNN 分类算法应用
还是鸢尾花数据集,这次我们用 K 近邻(KNN)算法来给鸢尾花样本 “贴标签”,判断它们属于哪个品种。
- 数据划分:我们把数据集分成训练集和测试集,测试集占 30%。这就好比让模型先在 “训练班” 里学习,然后通过 “考试”(测试集)来检验学习成果。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
iris_X = iris.data
iris_y = iris.target
X_train, X_test, y_train, y_test = train_test_split(iris_X, iris_y, test_size=0.3, random_state=0)
- 模型训练与预测:创建 KNN 分类器时,我们设定
n_neighbors = 5
,意思是让模型在做决策时参考离它最近的 5 个邻居的类别。模型在训练集上 “努力学习” 数据特征,之后就能对测试集进行预测啦。
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors = 5)
knn.fit(X_train, y_train)
print(knn.predict(X_test))
print(y_test)
- 模型评估与优化:为了知道模型的 “实力”,我们采用交叉验证的方法。通过改变 K 值,观察模型准确率的变化,找到最适合的 K 值,让模型发挥出最佳性能。
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
k_range = range(1, 10)
k_scores = []
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, iris_X, iris_y, cv=10, scoring='accuracy')
k_scores.append(scores.mean())
plt.plot(k_scores, k_range)
plt.xlabel('Cross-Validation Mean Accuracy')
plt.ylabel('K Value in KNN')
plt.show()
(三)猜猜他 / 她是谁:基于学生信息的性别分类
这个案例非常有趣,我们从 Excel 文件里读取学生姓名和相关描述信息,构建一个能判断性别的模型。
- 数据读取与整理:利用
xlrd
库,我们像 “数据侦探” 一样,从 Excel 文件中提取男生和女生的姓名及描述信息,分别存到对应的集合里。
import xlrd
def getnamelist():
boyset = {}
girlset = {}
rd = xlrd.open_workbook("数据集.xls")
table1 = rd.sheet_by_name("男")
table2 = rd.sheet_by_name("女")
for i in range(1, 25):
boyset.update({table1.cell(i, 0).value: table1.cell(i, 1).value})
girlset.update({table2.cell(i, 0).value: table2.cell(i, 1).value})
return boyset, girlset
- 特征工程:为了让模型能识别出性别特征,我们精心定义了一系列特征词库,比如女性姓名常用字、代表男性运动爱好的词汇、女生爱逛街相关的词汇等。然后根据这些特征,给每个学生计算相应的特征值。
import xlwt
def sexclass(boyset, girlset):
workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet("特征值表")
worksheet.write(0, 0, label='姓名')
worksheet.write(0, 1, label='姓名特征表')
worksheet.write(0, 2, label='脏话特征表')
worksheet.write(0, 3, label='运动特征表')
worksheet.write(0, 4, label='逛街特征表')
worksheet.write(0, 5, label='分类标签')
femalename = ["娟", "姗", "婷", "娜", "妃", "娇", "缤", "秀", "美", "慧", "敏", "淑", "静", "洁", "玲", "雪", "琴", "嫣", "娘", "黛", "玲", "灵", "蓉", "姬", "嬛", "钗", "公"]
shitlst = []
playlst = ["腹肌", "强壮", "俯卧撑", "冷水澡", "光头", "小宇宙", "篮球", "打球", "打篮球", "撸铁", "光腚", "女朋友", "老婆"]
shoplst = ["高跟鞋", "逛街", "口红", "乳液", "面膜", "唇膏", "耳洞", "耳钉", "嫁给", "当伴娘", "男朋友", "女汉子", "女生", "姐"]
i = 1
for key, value in boyset.items():
worksheet.write(i, 0, label=key)
worksheet.write(i, 5, label=1)
if key[-1] in femalename or key[-2] in femalename:
worksheet.write(i, 1, label=0)
else:
worksheet.write(i, 1, label=1)
for sh in shitlst:
if sh in value:
temp = 1
worksheet.write(i, 2, label=temp)
temp = 0
for pl in playlst:
if pl in value:
temp = 1
worksheet.write(i, 3, label=temp)
temp = 0
for sl in shoplst:
if sl in value:
temp = 1
worksheet.write(i, 4, label=temp)
temp = 0
i = i + 1
for key, value in girlset.items():
worksheet.write(i, 0, label=key)
worksheet.write(i, 5, label=0)
if key[-1] in femalename or key[-2] in femalename:
worksheet.write(i, 1, label=0)
else:
worksheet.write(i, 1, label=1)
for sh in shitlst:
if sh in value:
temp = 1
worksheet.write(i, 2, label=temp)
temp = 0
for pl in playlst:
if pl in value:
temp = 1
worksheet.write(i, 3, label=temp)
temp = 0
for sl in shoplst:
if sl in value:
temp = 1
worksheet.write(i, 4, label=temp)
temp = 0
i = i + 1
workbook.save('特征值表单.xls')
- 模型训练与评估:把生成的特征值文件转换成 CSV 格式,用 KNN 和高斯贝叶斯等模型进行训练和测试,通过交叉验证来评估模型的性能,看看模型猜性别到底准不准。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import cross_val_score
import xlrd
import csv
import codecs
def xlsx_to_csv():
workbook = xlrd.open_workbook('特征值表单.xls')
table = workbook.sheet_by_index(0)
with codecs.open('1.csv', 'w', encoding='GB18030') as f:
write = csv.writer(f)
for row_num in range(table.nrows):
row_value = table.row_values(row_num)
write.writerow(row_value)
def load_data(filename):
data = np.genfromtxt(filename, delimiter=',')
x = data[:, :4]
y = data[:, 4].astype(int)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
return x_train, x_test, y_train, y_test
xlsx_to_csv()
X_train, X_test, y_train, y_test = load_data("1.csv")
knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, y_train)
print(knn.predict(X_test))
print(y_test)
scores = cross_val_score(knn, X_train, y_train, cv = 3, scoring = 'accuracy')
print(scores)
clf = GaussianNB()
clf = clf.fit(X_train, y_train)
print(clf.predict(X_test))
print(y_test)
scores = cross_val_score(clf, X_test, y_test, cv = 3, scoring = 'accuracy')
print(scores)
二、机器学习学习过程全解析
- 数据探索之旅:拿到数据集后,要先深入了解它,包括数据的特征含义、数据类型、是否存在缺失值等。数据就像是机器学习的 “原材料”,优质的原材料是成功的关键。
- 数据预处理魔法:这一步是对数据进行清洗和转换。比如处理缺失值,可以选择填充或删除;对数值型数据进行标准化或归一化,让不同特征处于同一 “起跑线”;对于文本数据,要进行特征提取,把文字变成数字,让模型能够理解。
- 模型选型攻略:根据任务类型(分类、聚类、回归等)选择合适的模型。分类任务常用 KNN、逻辑回归、决策树等;聚类任务可以用 K-Means;回归任务则有线性回归等。不同模型有不同的特点和适用场景,选对模型很重要。
- 模型训练与评估实战:把数据集分成训练集和测试集,用训练集训练模型,让模型学习数据中的规律。然后用测试集评估模型性能,常用的评估指标有准确率、召回率、F1 值、混淆矩阵等。这些指标能帮助我们了解模型的优缺点。
- 模型优化秘籍:如果模型性能不理想,就需要优化。可以调整模型参数,尝试不同的模型,或者改进数据预处理方法。这就像给模型 “升级”,让它变得更强大。
三、AI 助力:基于电影数据的类型分类实践
(一)创意构思:打造电影类型 “预测大师”
我们设想构建一个模型,通过电影的演员阵容、导演风格、剧情关键词等特征,预测电影的类型。这对于电影推荐、内容管理等方面都有很大的实用价值。
(二)借助 AI 工具:ChatGPT 来帮忙
- 需求沟通:我向 ChatGPT 详细描述了任务,包括数据的大致情况、想要使用的 KNN 算法、预期实现的功能,比如 “我有包含电影剧情关键词和类型的数据集,想用 KNN 算法实现电影类型分类,帮我写完整代码,涵盖数据预处理、模型训练和评估部分”。
- 代码打磨:ChatGPT 生成代码后,我仔细检查代码的语法和逻辑。对于不理解或者不符合我预期的部分,我再次与它交流,比如 “代码里数据预处理部分没有处理文本中的特殊字符,能否优化一下”,通过不断沟通,让代码更完善。
(三)代码实现:构建电影分类模型
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
# 假设从CSV文件读取电影数据,包含剧情关键词、电影类型
data = pd.read_csv('movies.csv')
X = data['plot_keywords']
y = data['genre']
# 使用TF - IDF将文本特征转换为数值特征
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建KNN模型并训练
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 预测并评估
y_pred = knn.predict(X_test)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy}")
(四)成果展示:模型预测效果
运行代码后,我们得到模型在测试集上的准确率。如果准确率较高,说明模型能较好地根据剧情关键词预测电影类型;要是准确率不太理想,那就需要进一步优化模型,比如调整 K 值、尝试其他特征提取方法等。
机器学习的世界丰富多彩,充满了无限可能。通过这些有趣的案例,我们不仅学会了如何运用机器学习算法解决实际问题,还掌握了机器学习的基本流程。希望大家能从这些案例中获得启发,开启自己的机器学习探索之旅,创造出更多有趣又实用的应用!
更多推荐
所有评论(0)