from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
df = pd.DataFrame({
'Country': ['AB', 'CD', 'EF', 'FG']*20,
'ColumnA' : [1]*20*4,'ColumnB' : [10]*20*4, 'Label': [1,0,1,0]*20
})
df['Country_Code'] = df['Country'].astype('category').cat.codes
X = df.loc[:, df.columns.drop(['Label','Country'])]
y = df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=df.Country_Code)
lm = LinearRegression()
lm.fit(X_train,y_train)
lm_predictions = lm.predict(X_test)
country
в числа и сохранить их как новый столбец x
отбрасывание данных поезда label
(y
), а также строка country
столбцов Если ваши тестовые данные, по которым вы будете делать прогнозы, появятся позже, вам понадобится механизм для преобразования их country
в [ 118], прежде чем делать прогнозы. В таких случаях рекомендуется использовать метод LabelEncoder
, для которого можно использовать метод fit
для кодирования строк в метках, а затем использовать transform
для кодирования страны тестовых данных.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import preprocessing
df = pd.DataFrame({
'Country': ['AB', 'CD', 'EF', 'FG']*20,
'ColumnA' : [1]*20*4,'ColumnB' : [10]*20*4, 'Label': [1,0,1,0]*20
})
# Train-Validation
le = preprocessing.LabelEncoder()
df['Country_Code'] = le.fit_transform(df['Country'])
X = df.loc[:, df.columns.drop(['Label','Country'])]
y = df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=df.Country_Code)
lm = LinearRegression()
lm.fit(X_train,y_train)
# Test
test_df = pd.DataFrame({'Country': ['AB'], 'ColumnA' : [1],'ColumnB' : [10] })
test_df['Country_Code'] = le.transform(test_df['Country'])
print (lm.predict(test_df.loc[:, test_df.columns.drop(['Country'])]))
Класс ObjectDumper, как известно, делает это. Я никогда не подтверждал, но я всегда подозревал, что немедленное окно использует это.
РЕДАКТИРОВАТЬ: Я только что понял, что код ObjectDumper находится на вашем компьютере. Перейдите по адресу:
c: / Program Files / Microsoft Visual Studio 9.0 / Samples / 1033 / CSharpSamples.zip
Это будет распаковано в папку с именем LinqSamples. Там есть проект ObjectDumper. Используйте это.
(Это также порадует Дэвида в комментариях :))
Для этого можно использовать класс TypeDescriptor :
foreach(PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
{
string name=descriptor.Name;
object value=descriptor.GetValue(obj);
Console.WriteLine("{0}={1}",name,value);
}
TypeDescriptor находится в пространстве имен System.ComponentModel и является API-интерфейсом Visual Studio использует для отображения вашего объекта в его обозревателе свойств. В конечном итоге он основан на отражении (как и любое другое решение), но обеспечивает довольно хороший уровень абстракции от API отражения.
Что касается TypeDescriptor из ответа Шона (я не могу комментировать, потому что у меня плохая репутация) ... одним из преимуществ использования TypeDescriptor над GetProperties () является то, что TypeDescriptor имеет механизм для динамического присоединения свойств к объектам во время выполнения и нормального отражения будут их пропускать.
Например, при работе с PowerShell PSObject, свойства и методы которого могут быть добавлены во время выполнения, они реализовали настраиваемый TypeDescriptor, который объединяет эти элементы со стандартным набором элементов. Используя TypeDescriptor, ваш код не должен знать об этом факте.
Компоненты, элементы управления и, я думаю, возможно, DataSets также используют этот API.
Именно для этого и нужно отражение. Я не думаю, что есть более простое решение, но рефлексия в любом случае не требует большого количества кода.
Любое другое решение / библиотека в конечном итоге будет использовать отражение для анализа типа ...
Следующий фрагмент выполнит желаемую функцию:
Type t = obj.GetType(); // Where obj is object whose properties you need.
PropertyInfo [] pi = t.GetProperties();
foreach (PropertyInfo p in pi)
{
System.Console.WriteLine(p.Name + " : " + p.GetType());
}
Я думаю, если вы напишете это как метод расширения, вы сможете использовать его для всех типов объектов.
Не думаю. Мне всегда приходилось писать их или использовать чужую работу, чтобы получить эту информацию. Насколько мне известно, это должно быть отражением.
РЕДАКТИРОВАТЬ:
Проверьте это . Я исследовал некоторую отладку на длинных графах объектов и заметил это, когда я добавил Watches, VS выдает в этом классе: Mscorlib_CollectionDebugView <>
. Это внутренний тип для удобного отображения коллекций для просмотра в окнах просмотра / режимах отладки кода. Теперь, потому что он внутренний, вы можете ссылаться на него, но вы можете использовать Reflector, чтобы скопировать (из mscorlib) код и получить свой собственный (ссылка выше содержит пример копирования / вставки). Выглядит действительно полезно.