【问题标题】:cannot convert string to float when working on machine learning algorithms (python 3) (Anaconda)处理机器学习算法时无法将字符串转换为浮点数(python 3)(Anaconda)
【发布时间】:2018-10-06 00:37:37
【问题描述】:

我目前正在关注关于使用机器学习算法处理 KDD 99 杯数据集的视频。运行下面的代码时,我收到一条错误消息,提示“无法将字符串转换为浮点‘正常’”。“正常”是在下面显示的 Y 功能集中找到的标签之一。 y 特征集有 23 个标签,当我测试算法仅针对 3 个 y 特征(正常、蓝精灵和海王星)进行预测时,它工作得非常好,但是一旦我尝试让它针对所有标签进行预测,我就会得到错误。 任何指导将不胜感激,因为我已经为此工作了 2 天。

feature_cols =['duration','src_bytes','dst_bytes','land',
   'wrong_fragment', 'urgent', 'hot', 'num_failed_logins', 'logged_in',
   'num_compromised', 'root_shell', 'su_attempted', 'num_root',
   'num_file_creations', 'num_shells', 'num_access_files',
   'num_outbound_cmds', 'is_host_login', 'is_guest_login', 'count',
   'srv_count', 'serror_rate', 'srv_serror_rate', 'rerror_rate',
   'srv_rerror_rate', 'same_srv_rate', 'diff_srv_rate',
   'srv_diff_host_rate', 'dst_host_count', 'dst_host_srv_count',
   'dst_host_same_srv_rate', 'dst_host_diff_srv_rate',
   'dst_host_same_src_port_rate', 'dst_host_srv_diff_host_rate',
   'dst_host_serror_rate', 'dst_host_srv_serror_rate',
   'dst_host_rerror_rate', 'dst_host_srv_rerror_rate', 'label',
   'proto__icmp', 'proto__tcp', 'proto__udp']

x = dataset[feature_cols]
y = dataset.label

y.value_counts(normalize=True)

Y 特征标签

smurf.          
neptune.  
normal.   
back.    
satan.     
ipsweep.     
portsweep.    
warezclient.   
teardrop.    
pod.        
nmap.     
guess_passwd.
buffer_overflow.
land.
warezmaster.
imap.
rootkit.
loadmodule.
ftp_write.
multihop.
phf.
perl.
spy.
Name: label, dtype: float64

代码和错误

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
scores = cross_val_score(dt, x, y, scoring='accuracy', cv=10)
print (scores)
print ("Accuracy: %2.10f" % np.mean(scores))

ValueError                                Traceback (most recent call last)
<ipython-input-70-722f95b657f5> in <module>()
      1 from sklearn.tree import DecisionTreeClassifier
      2 dt = DecisionTreeClassifier()
----> 3 scores = cross_val_score(dt, x, y, scoring='accuracy', cv=10)
      4 print (scores)
      5 print ("Accuracy: %2.10f" % np.mean(scores))

~\Anaconda3\lib\site-packages\sklearn\cross_validation.py in cross_val_score(estimator, X, y, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch)
   1579                                               train, test, verbose, None,
   1580                                               fit_params)
-> 1581                       for train, test in cv)
   1582     return np.array(scores)[:, 0]
   1583 

~\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py in __call__(self, iterable)
    777             # was dispatched. In particular this covers the edge
    778             # case of Parallel used with an exhausted iterator.
--> 779             while self.dispatch_one_batch(iterator):
    780                 self._iterating = True
    781             else:

~\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py in dispatch_one_batch(self, iterator)
    623                 return False
    624             else:
--> 625                 self._dispatch(tasks)
    626                 return True
    627 

~\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py in _dispatch(self, batch)
    586         dispatch_timestamp = time.time()
    587         cb = BatchCompletionCallBack(dispatch_timestamp, len(batch), self)
--> 588         job = self._backend.apply_async(batch, callback=cb)
    589         self._jobs.append(job)
    590 

~\Anaconda3\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py in apply_async(self, func, callback)
    109     def apply_async(self, func, callback=None):
    110         """Schedule a func to be run"""
--> 111         result = ImmediateResult(func)
    112         if callback:
    113             callback(result)

~\Anaconda3\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py in __init__(self, batch)
    330         # Don't delay the application, to avoid keeping the input
    331         # arguments in memory
--> 332         self.results = batch()
    333 
    334     def get(self):

~\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py in __call__(self)
    129 
    130     def __call__(self):
--> 131         return [func(*args, **kwargs) for func, args, kwargs in self.items]
    132 
    133     def __len__(self):

~\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py in <listcomp>(.0)
    129 
    130     def __call__(self):
--> 131         return [func(*args, **kwargs) for func, args, kwargs in self.items]
    132 
    133     def __len__(self):

~\Anaconda3\lib\site-packages\sklearn\cross_validation.py in _fit_and_score(estimator, X, y, scorer, train, test, verbose, parameters, fit_params, return_train_score, return_parameters, error_score)
   1673             estimator.fit(X_train, **fit_params)
   1674         else:
-> 1675             estimator.fit(X_train, y_train, **fit_params)
   1676 
   1677     except Exception as e:

~\Anaconda3\lib\site-packages\sklearn\tree\tree.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
    788             sample_weight=sample_weight,
    789             check_input=check_input,
--> 790             X_idx_sorted=X_idx_sorted)
    791         return self
    792 

~\Anaconda3\lib\site-packages\sklearn\tree\tree.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
    114         random_state = check_random_state(self.random_state)
    115         if check_input:
--> 116             X = check_array(X, dtype=DTYPE, accept_sparse="csc")
    117             y = check_array(y, ensure_2d=False, dtype=None)
    118             if issparse(X):

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    431                                       force_all_finite)
    432     else:
--> 433         array = np.array(array, dtype=dtype, order=order, copy=copy)
    434 
    435         if ensure_2d:

ValueError: could not convert string to float: 'normal.'

根据要求提供完整代码

import pandas as pd

import warnings
warnings.filterwarnings('ignore')

col_names = ["duration","protocol_type","service","flag","src_bytes",
    "dst_bytes","land","wrong_fragment","urgent","hot","num_failed_logins",
    "logged_in","num_compromised","root_shell","su_attempted","num_root",
    "num_file_creations","num_shells","num_access_files","num_outbound_cmds",
    "is_host_login","is_guest_login","count","srv_count","serror_rate",
    "srv_serror_rate","rerror_rate","srv_rerror_rate","same_srv_rate",
    "diff_srv_rate","srv_diff_host_rate","dst_host_count","dst_host_srv_count",
    "dst_host_same_srv_rate","dst_host_diff_srv_rate","dst_host_same_src_port_rate",
    "dst_host_srv_diff_host_rate","dst_host_serror_rate","dst_host_srv_serror_rate",
    "dst_host_rerror_rate","dst_host_srv_rerror_rate","label"]
dataset = pd.read_csv('../data/kddcup.data', header=None, names=col_names)

# Warning, takes a while to load

# make dummy variables for protocol type

protocol_dummies = pd.get_dummies(dataset['protocol_type'], prefix='proto_')

# concatenate the dummy variable columns onto the original DataFrame (axis=0 means rows, axis=1 means columns)
dataset = pd.concat([dataset, protocol_dummies], axis=1)

del dataset['protocol_type']

x = dataset.drop(['label'], axis=1)
y = dataset.label

from sklearn.cross_validation import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
import numpy as np
from sklearn.cross_validation import train_test_split
from datetime import datetime

feature_cols =['duration','src_bytes','dst_bytes','land',
       'wrong_fragment', 'urgent', 'hot', 'num_failed_logins', 'logged_in',
       'num_compromised', 'root_shell', 'su_attempted', 'num_root',
       'num_file_creations', 'num_shells', 'num_access_files',
       'num_outbound_cmds', 'is_host_login', 'is_guest_login', 'count',
       'srv_count', 'serror_rate', 'srv_serror_rate', 'rerror_rate',
       'srv_rerror_rate', 'same_srv_rate', 'diff_srv_rate',
       'srv_diff_host_rate', 'dst_host_count', 'dst_host_srv_count',
       'dst_host_same_srv_rate', 'dst_host_diff_srv_rate',
       'dst_host_same_src_port_rate', 'dst_host_srv_diff_host_rate',
       'dst_host_serror_rate', 'dst_host_srv_serror_rate',
       'dst_host_rerror_rate', 'dst_host_srv_rerror_rate', 'label',
       'proto__icmp', 'proto__tcp', 'proto__udp']

x = dataset[feature_cols]
y = dataset.label

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
scores = cross_val_score(dt, x, y, scoring='accuracy', cv=10)
print (scores)
print ("Accuracy: %2.10f" % np.mean(scores))

kdd 数据集中的一行

0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8 ,0.00,0.00,0.00,0.00,1.00,0.00,0.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,正常。

【问题讨论】:

  • 什么是logreg?你是如何为 logreg 赋值的?
  • 对不起@âńōŋŷXmoůŜ 那应该说 dt 不是 logreg 但无论哪种方式仍然同样的问题欢呼
  • 在分配 y 标签时出现问题。 y = 数据集.标签。由于您没有向我们提供输入数据,因此我无法看到全貌。但是,我可以看到 y 被分配给一个标签(字符串)而不是 y 的值(数字数组)。您能否也向我们展示一下从一开始的整个代码?
  • 将完整代码添加到末尾
  • @âńōŋŷXmoůŜ 我还提供了 kdd 数据集文件中的一行,以帮助您了解文件的外观。原来有数百万行这样的所有代表一个网络连接

标签: python-3.x machine-learning scikit-learn anaconda


【解决方案1】:

我刚刚意识到我在 x 特征中留下了标签列。我已经把它拿出来了,现在它可以工作了。

【讨论】:

    猜你喜欢
    • 2019-11-07
    • 2019-10-14
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2020-09-18
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多