机器学习是人工智能和数据科学领域的一个重要分支,它通过训练算法来预测输出,基于过去的数据。输入数据可以不断变化,算法也可以相应地进行微调以提供更好的输出。机器学习的应用非常广泛,例如谷歌使用它来预测自然灾害,如洪水。在政治领域,如何分析选民的人口统计数据也是一个常见的应用场景。
数据是机器学习的关键。数据越多,算法就能更好地学习和微调。对于任何问题的输出,都会有多个因素在起作用,其中一些因素的影响比其他因素大。分析并应用所有这些发现是机器学习问题的一部分。从数学上讲,机器学习将问题的输出转换为多个输入因素的函数。
Y = f(x)
其中,Y 是预测输出,x 是作为输入的多个因素。
将机器学习应用于问题有一个结构化的方式。这里尝试以图形化的方式展示工作流程,以便更容易地可视化和理解。工作流程是一个循环,一旦从发布的模型中获得了一些洞察,它就会回到漏斗中,作为学习以使输出更好。
数据科学家大约花费60%的时间在数据清洗和组织上。
让使用泰坦尼克号幸存者的数据集,并运行基本的工作流程,看看旅行等级、性别、年龄和票价等特征是如何帮助评估生存概率的。
数据可以有多种格式。最简单的是将其保存为csv格式,然后使用pandas加载。
# 让加载并查看数据集的信息
titanicdf = pd.read_csv("data-files/titanic.csv")
print(titanicdf.info())
数据集包含1309条记录,14个列,包括乘客等级、生存状态、姓名、性别、年龄等信息。
并非捕获的所有数据都是需要的。将拥有一个包含额外信息的数据超集,这些信息与问题陈述无关。这些数据将作为噪声,因此在开始对它们进行任何机器学习算法处理之前,最好先清理数据集。
# 删除认为不相关的列
titanicdf.drop(['embarked', 'body', 'boat', 'name', 'cabin', 'home.dest', 'ticket', 'sibsp', 'parch'], axis='columns', inplace=True)
数据分析有多种方式。根据问题陈述,需要了解讨论中数据的一般趋势。统计学和概率分布知识在这里有帮助。为了获得洞察以更好地理解相关性和模式,数据可视化洞察很有帮助。
# 让看看是否有任何高度相关的数据
import seaborn as sns
sns.pairplot(titanicdf)
从图表中看,似乎没有立即需要删除的内容。
为了更容易地处理数据,一旦它们被转换为数字(从字符串),这有助于将它们输入到各种统计公式中以获得更多洞察。
# 将类别转换为数字
titanicdf = pd.get_dummies(titanicdf, columns=['pclass'])
# 将性别转换为数字
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
titanicdf['sex'] = le.fit_transform(titanicdf.sex)
总会有一些缺失数据或异常值。在缺失数据上运行算法可能会导致不一致的结果或算法失败。根据上下文,可以选择删除它们或用适当的值填充/替换它们。
# 用平均年龄填充缺失的年龄值
titanicdf.loc[titanicdf['age'].isnull(), 'age'] = titanicdf['age'].mean()
# 同样的方法可以用于票价,但将使用另一种方式
titanicdf.dropna(inplace=True)
有时,上下文中的各种数据具有不同的尺度。在这种情况下,如果数据没有归一化,算法可能会对具有更高幅度的数据产生偏见。例如,特征A的值范围是0-10,特征B的范围是0-10000。在这种情况下,即使A的幅度变化很小也可能产生差异,但如果数据没有归一化,特征B将更多地影响结果(这可能不是实际情况)。
# 将每列缩放到0均值和1标准差
from sklearn import preprocessing
X = titanicdf.drop(['survived'], axis=1)
y = titanicdf['survived']
X_scaled = preprocessing.scale(X)
最好将数据集分成两个不等的部分。较大的部分用于训练算法,然后较小的部分用于测试训练过的算法。这样,算法就不会仅仅对输入数据产生偏见,测试数据的结果可以提供更好的画面。
# 将数据集分成训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y)
一旦按照需求准备好了训练数据集,就可以应用机器学习算法,找到最适合的模型。
# 现在,选择任意一个分类器 - KN
from sklearn.neighbors import KNeighborsClassifier
dtc = KNeighborsClassifier(n_neighbors=5)
dtc.fit(X_train, y_train)
为了验证模型,使用测试数据集,将模型预测的值与实际数据进行比较,这有助于了解机器学习模型的准确性。
# 验证模型
import sklearn.metrics as met
pred_knc = dtc.predict(X_test)
print("Nearest neighbors: %.3f" % (met.accuracy_score(y_test, pred_knc)))