简介
scikit-learn(简称sklearn)是一个开源的Python机器学习库,它提供了简单而高效的工具用于数据挖掘和数据分析,并且拥有一个活跃的开发社区。它建立在NumPy、SciPy和matplotlib这些科学计算库之上,旨在提供一致且可复用的API。
中文社区
安装
pip install scikit-learn
模型训练与预测
步骤
-
导入必要的库:首先需要导入sklearn中你需要用到的模块,以及其他可能需要的库,如numpy、pandas等。
import pandas as pd from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error from sklearn.model_selection import train_test_split
-
加载数据:从数据路径中加载你的训练数据集
iowa_file_path = '../input/train.csv' home_data = pd.read_csv(iowa_file_path)
-
划分数据集:将训练数据集划分为训练集和验证集。
y = home_data.SalePricefeatures = ['LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd'] X = home_data[features]train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)
-
选择模型:选择一个适合你问题的模型,比如决策树、随机森林、支持向量机等。
rf_model = RandomForestRegressor(random_state=1)
-
训练模型:使用训练集数据训练模型。
rf_model.fit(train_X, train_y)
-
模型预测和评估:使用验证集数据进行预测,然后评估模型的性能。
rf_val_predictions = rf_model.predict(val_X) rf_val_mae = mean_absolute_error(rf_val_predictions, val_y)
-
模型优化:根据模型评估的结果,调整模型参数或选择不同的模型进行优化。
这里通过遍历优化max_leaf_nodesdef cal_mae(mln,train_X,val_X,train_y,val_y):rf_model = RandomForestRegressor(random_state=1, max_leaf_nodes = mln)rf_model.fit(train_X, train_y)rf_val_predictions = rf_model.predict(val_X)rf_val_mae = mean_absolute_error(rf_val_predictions, val_y)return rf_val_mae for i in [5,10,25,50,100,150,200]:print(cal_mae(i,train_X,val_X,train_y,val_y))
-
预测新数据:使用筛选出来的较优参数用所有训练集训练一个好的模型,对测试数据进行预测。
rf_model_on_full_data = RandomForestRegressor(random_state=1)rf_model_on_full_data.fit(X,y)test_data_path = '../input/test.csv' test_data = pd.read_csv(test_data_path) test_X = test_data[features]test_preds = rf_model_on_full_data.predict(test_X)
完整代码
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_splitiowa_file_path = '../input/train.csv'
home_data = pd.read_csv(iowa_file_path)y = home_data.SalePrice
features = ['LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd']
X = home_data[features]
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)rf_model = RandomForestRegressor(random_state=1)
rf_model.fit(train_X, train_y)
rf_val_predictions = rf_model.predict(val_X)
rf_val_mae = mean_absolute_error(rf_val_predictions, val_y)print("Validation MAE for Random Forest Model: {:,.0f}".format(rf_val_mae))rf_model_on_full_data = RandomForestRegressor(random_state=1)
rf_model_on_full_data.fit(X,y)test_data_path = '../input/test.csv'
test_data = pd.read_csv(test_data_path)
test_X = test_data[features]test_preds = rf_model_on_full_data.predict(test_X)
结果保存
to_csv
函数可以把DataFrame
结果保存成csv文件
output = pd.DataFrame({'Id': test_data.Id,'SalePrice': test_preds})
output.to_csv('submission.csv', index=False)
模型保存与读取
持久化模型:将训练好的模型保存到文件中,以便以后使用。
- joblib是一个用于Python的库,它提供了一种高效的序列化方式,特别适合于存储和加载大型NumPy数组、Pandas数据帧(DataFrames)以及机器学习模型等Python对象。
- joblib特别优化了对大数据的处理,使用内存映射文件(memory-mapped files)来处理大型数据集,这使得它在处理大型数据时比Python的pickle模块更加高效。
from joblib import dump, load
dump(best_model, 'model.joblib')
加载模型:从文件中加载模型,用于后续的预测或评估。
loaded_model = load('model.joblib')
缺失值处理
在选择处理缺失值的方法时,重要的是要理解数据缺失的原因,以及缺失值对模型可能产生的影响。有时候,结合多种方法,或者对不同的处理策略进行实验,可以帮助找到最佳的解决方案。
删除含有缺失值的列
这种方法是最简单的处理缺失值的方式,即直接删除任何含有缺失值的列。
优点:操作简单,可以快速减少数据集中的缺失值问题。
缺点:如果被删除的列中大部分值都是完整的,那么模型就会失去很多有用信息。
- 极端情况下,比如一个数据集有10,000行,其中一列只缺失了一个值,这种方法会将整个列删除,这可能会导致信息的大量丢失。
m = []
for col in X_train.columns:if X_train[col].isnull().sum() != 0:m.append(col)
print(m)reduced_X_train = X_train.drop(m,axis = 1)
插值
插补是一种更为复杂的处理缺失值的方法,它通过填充缺失值来处理。
- 例如,我们可以将每列的缺失值替换为该列的平均值。
优点:虽然插补的值在大多数情况下不会完全准确,但通常比直接删除整个列能得到更准确的模型结果。
缺点:插补基于某些假设(如均值、中位数等),这些假设可能不总是成立。且某些插补方法(如KNN)可能需要较高的计算成本。
插补可以基于多种不同的策略,如均值、中位数、众数或者使用更复杂的算法如K-最近邻(KNN)来估计缺失值。
SimpleImputer是用于缺失值插补的转换器。
class sklearn.impute.SimpleImputer(*, missing_values=nan, strategy='mean', fill_value=None, verbose=0, copy=True, add_indicator=False)
SimpleImputer提供了两个主要的方法:fit(X[, y])和fit_transform(X[, y])。
fit(X[, y])
- 拟合插补:fit方法用于在数据集X上学习缺失值的插补策略。对于数值型数据,这通常意味着计算所有非缺失值的均值、中位数或众数;对于分类数据,则可能是最频繁出现的类别。
- 不转换数据:fit方法不会改变或转换数据,它仅仅学习插补的参数(如均值、中位数等)。
- 返回值:fit方法返回SimpleImputer对象本身,这个对象已经根据X的数据更新了其内部状态,存储了用于插补的统计值。
fit_transform(X[, y])
- 拟合并转换数据:fit_transform方法首先执行fit操作,学习缺失值的插补策略,然后立即应用这个策略来转换数据集X,填充所有的缺失值。
- 返回转换后的数据:与fit方法不同,fit_transform方法返回转换后的数据集,其中所有的缺失值已经被插补。
from sklearn.impute import SimpleImputerimputer = SimpleImputer()
imputed_X_train = pd.DataFrame(imputer.fit_transform(X_train))
imputed_X_valid = pd.DataFrame(imputer.transform(X_valid))# 只用fit一次# 插补会删除列名称,需要重新补上
imputed_X_train.columns = X_train.columns
imputed_X_valid.columns = X_valid.columns
插补的扩展
插补是处理缺失值的标准方法,通常效果不错。但是,插补的值可能会系统地高于或低于它们实际的值(这些值在数据集中没有被收集)。或者,含有缺失值的行在其他方面可能是独特的。在这种情况下,模型如果能够考虑哪些值最初是缺失的,将会做出更好的预测。
这种方法在传统的插补基础上进行了扩展。
- 首先像以前一样对缺失值进行插补。
- 然后对于原始数据集中有缺失值的每一列,添加一个新列来显示是否插补。
- 这个新列用来表明原始数据中哪些位置是缺失的,而哪些是后来插补的。
这种方法的优点在于,它不仅保留了数据的完整性,还提供了额外的信息,这可能会帮助模型捕捉到缺失值背后的模式或趋势。
imputer = SimpleImputer()
imputed_X_train = pd.DataFrame(imputer.fit_transform(X_train))# 添加一个新列来标记插补的位置
for column in X_train.columns:# 检查原始数据集中哪些值是缺失的missing_mask = X_train[column].isnull()# 在插补后的DataFrame中添加一个新列来标记这些缺失值imputed_X_train [f'{column}_missing'] = missing_mask.astype(int)
来自Learn Tutorial Intermediate Machine Learning