这里我使用pandas来加载数据集,数据集采用kaggle的titanic的数据集,下载train.csv。
In [2]:
import pandas as pd
df = pd.read_csv('train.csv')
df = df.fillna(0) #将缺失值都替换为0
In [3]:
df.head()
Out[3]:
In [4]:
len(df)
Out[4]:
可以看到训练集中共有891条记录,有12个列(其中一列Survived是目标分类)。将数据集分为特征集和目标分类集,两个DataFrame。
In [5]:
cols = set(df.columns)
cols.remove('Survived')
x = df.ix[:,cols]
y = df['Survived'].values
由于Sklearn为了效率,接受的特征数据类型是dtype=np.float32以便获得最佳的算法效率。因此,对于类别类型的特征就需要转化为向量。Sklearn提供了DictVectorizer类将类别的特征转化为向量。DictVectorizer接受记录的形式为字典的列表。因此需要用pandas的to_dict方法转换DataFrame。
In [6]:
from sklearn.feature_extraction import DictVectorizer
v = DictVectorizer()
x = v.fit_transform(x.to_dict(outtype='records')).toarray()
让我们比较一下同一个实例的原始信息及向量化后的结果。
In [7]:
print 'Vectorized:', x[10]
print 'Unvectorized:', v.inverse_transform(x[10])
如果分类的标签也是字符的,那么就还需要用LabelEncoder方法进行转化。
将数据集分成训练集和测试集。
In [8]:
from sklearn.cross_validation import train_test_split
data_train, data_test, target_train, target_test = train_test_split(x, y)
In [9]:
len(data_train)
Out[9]:
In [10]:
len(data_test)
Out[10]:
In [ ]:
Model = EstimatorObject()
Model.fit(dataset.data, dataset.target)
dataset.data = dataset
dataset.target = labels
Model.predict(dataset.data)
In [22]:
from sklearn import cross_validation
from sklearn.naive_bayes import GaussianNB
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn import svm
import datetime
estimators = {}
estimators['bayes'] = GaussianNB()
estimators['tree'] = tree.DecisionTreeClassifier()
estimators['forest_100'] = RandomForestClassifier(n_estimators = 100)
estimators['forest_10'] = RandomForestClassifier(n_estimators = 10)
estimators['svm_c_rbf'] = svm.SVC()
estimators['svm_c_linear'] = svm.SVC(kernel='linear')
estimators['svm_linear'] = svm.LinearSVC()
estimators['svm_nusvc'] = svm.NuSVC()
首先是定义各个model所用的算法。
In [23]:
for k in estimators.keys():
start_time = datetime.datetime.now()
print '----%s----' % k
estimators[k] = estimators[k].fit(data_train, target_train)
pred = estimators[k].predict(data_test)
print("%s Score: %0.2f" % (k, estimators[k].score(data_test, target_test)))
scores = cross_validation.cross_val_score(estimators[k], data_test, target_test, cv=5)
print("%s Cross Avg. Score: %0.2f (+/- %0.2f)" % (k, scores.mean(), scores.std() * 2))
end_time = datetime.datetime.now()
time_spend = end_time - start_time
print("%s Time: %0.2f" % (k, time_spend.total_seconds()))
这里通过算法的score方法及cross_validation来计算预测的准确性。
可以看到准确性比较高的算法需要的时间也会增加。性价比较高的算法是随机森林。 让我们用kaggle给出的test.csv的数据集测试一下。
In [13]:
test = pd.read_csv('test.csv')
test = test.fillna(0)
test_d = test.to_dict(outtype='records')
test_vec = v.transform(test_d).toarray()
这里需要注意的是test的数据也需要经过同样的DictVectorizer转换。
In [ ]:
for k in estimators.keys():
estimators[k] = estimators[k].fit(x, y)
pred = estimators[k].predict(test_vec)
test['Survived'] = pred
test.to_csv(k + '.csv', cols=['Survived', 'PassengerId'], index=False)
好了,向Kaggle提交你的结果吧~